2012-03-27 5 views
0

에 두 개의 열 (1 - 문자열 유형, 다른 - 유형 번호)이있는 테이블이 주어진 경우 각 행에 여러 번 부여되었습니다. 두 번째 열에 지정된 횟수만큼 각 행에 부여 된 쿼리 (join 및 rownum 명령 사용)가 필요합니다. 예 :쿼리에서 두 번째 열 (sql, oracle)

col1 col2 
---- ---- 
apple 4 
melon 1 
banana 2 

결과 : 크기가 어떤의 상한은

apple 
apple 
apple 
apple 
melon 
banana 
banana 
+5

오, 하느님. 그들이 지금 한 것은 무엇입니까 – bernie

+1

어떤 SQL 엔진입니까? MySQL은? SQL 서버? 신탁? DB2? – mellamokb

+3

"그룹 해제"기능 ... – Glenn

답변

1

SQL 서버를 가정하면,이 집계 테이블의 현명한 사용 가능하다 (이 예에서는 sys.all_columns를 사용 생성 될 수있는 행의 수)와 인덱스 번호 범위에 대한 부분 합계를 계산하면 다음과 같습니다.

;with Ranges as (
    select 
     col1, 
     (select coalesce(sum(t2.col2), 0)+1 
      from MyTable t2 where t2.col1<t1.col1) as indexStart, 
     (select coalesce(sum(t2.col2), 0) 
      from MyTable t2 where t2.col1<=t1.col1) as indexEnd 
    from 
     MyTable t1 
) 
,TallyTable as (
    select 
     row_number() over (order by c.object_id, c.column_id) as number 
    from 
     sys.all_columns c 
) 
select 
    r.col1 
from 
    Ranges R, TallyTable T 
where 
    T.number between r.indexStart and r.indexEnd 

OP에 대한 의견으로 이것은 권장되지 않으며 비즈니스 문제에 대한 더 나은 해결책이있을 가능성이 큽니다.

+0

니스. 다른 스레드에서 배웠던 것처럼 PostgreSQL에는 PostgreSQL 버전의 TallyTable 대체품이 될 수있는 "generate_series"함수가 내장되어 있습니다. – Glenn

+0

대답에 대해 mellamokb에 감사하십시오 :) 그러나이 명령을 명령 (join, rownum)을 사용하여 작성할 수 있습니까? 미리 감사드립니다! – Kopro

0

당신이 결과 집합에 카운터를 추가, 잘

  • YourTable에서 모든 행을 선택하고 일을 할 것 재귀 CTE를 사용하여 SQL Server를 사용하는 가정. 주어진 열에
  • 같이 Recurse 카운터가 col2

SQL 문

;WITH q AS (
    SELECT col1, cnt = 1 
    FROM YourTable 
    UNION ALL 
    SELECT q.col1, cnt + 1 
    FROM q 
      INNER JOIN YourTable yt ON yt.col1 = q.col1 
    WHERE cnt < yt.col2   
) 
SELECT col1 
FROM q 
OPTION (MAXRECURSION 0) 

테스트 스크립트는 제공하지 않은 것처럼

;WITH YourTable(col1, col2) AS (
    SELECT 'apple', 4 
    UNION ALL SELECT 'melon', 1 
    UNION ALL SELECT 'banana', 2 
) 
, q AS (
    SELECT col1, cnt = 1 
    FROM YourTable 
    UNION ALL 
    SELECT q.col1, cnt + 1 
    FROM q 
      INNER JOIN YourTable yt ON yt.col1 = q.col1 
    WHERE cnt < yt.col2   
) 
SELECT col1 
FROM q 
OPTION (MAXRECURSION 0) 
+2

SQL Server에서 문 앞에 명령문 종료 문자가 필요하다는 사실에 익숙해 질 수는 없습니다 ... –

0

DBMS의의 값에 도달 할 때까지 나는 PostgreSQL을 가정한다 :

with test_data (col1, col2) as (
    values ('apple', 4), ('melon', 1), ('banana', 2) 
) 
select col1 
from (
    select col1, generate_series(1, col2) 
    from test_data 
) t 
관련 문제