2013-04-08 2 views
0

SQL에서 피벗 (pivot) 할 열을 가져 오는 데 문제가 있습니다. 한 열의 상위 6 개 결과를 행으로 피벗하고 싶습니다. 내가 선회하고있어 열은 시작보다 작거나 6 개 이상의 결과를 얻을 수 있지만열의 상위 6 개 항목을 SQL의 행으로 피벗시키는 방법

내 표는 다음과 같습니다 상위 6 이외에는 아무 것도 무시해야합니다 :

ID | GroupID | CodeNum 
---------------------- 
1 | 1  | 111 
2 | 1  | 222 
3 | 1  | 333 
4 | 1  | 444 
5 | 1  | 555 
6 | 1  | 666 
7 | 1  | 777 
8 | 2  | 111 
9 | 2  | 888 
10 | 3  | 999 

을 내가 원하는 내

GroupID | Code1 | Code2 | Code3 | Code4 | Code5 | Code6 
------------------------------------------------------- 
1  | 111 | 222 | 333 | 444 | 555 | 666 
2  | 111 | 888 |  |  |  | 
3  | 999 |  |  |  |  | 

내가 해봤 코드 : 출력은, 다음과 같이합니다

SELECT GroupID 
     , [Code1] = CASE WHEN rn = 1 THEN CodeNum END 
     , [Code2] = CASE WHEN rn = 2 THEN CodeNum END 
     , [Code3] = CASE WHEN rn = 3 THEN CodeNum END 
     , [Code4] = CASE WHEN rn = 4 THEN CodeNum END 
     , [Code5] = CASE WHEN rn = 5 THEN CodeNum END 
     , [Code6] = CASE WHEN rn = 6 THEN CodeNum END 
FROM (
      SELECT TOP 6 GroupID 
        , rn = ROW_NUMBER() OVER (ORDER BY ID) 
        , CodeNum 
      FROM Table1  
     ) q 
GROUP BY 
     GroupID 

을하지만 뻥 g

CodeNum이 GroupID 당 1 - 12 개의 값을 가질 수있는 방법이 있습니까?

답변

4

GROUP BY을 사용하고 있으므로 SELECT의 모든 항목을 그룹화하거나 집계 함수를 사용해야합니다.

당신은 결과를 얻을 다음을 사용하는 것이 좋습니다 다음 컬럼에 피벗 행이 :

SELECT GroupID 
     , [Code1] = max(CASE WHEN rn = 1 THEN CodeNum END) 
     , [Code2] = max(CASE WHEN rn = 2 THEN CodeNum END) 
     , [Code3] = max(CASE WHEN rn = 3 THEN CodeNum END) 
     , [Code4] = max(CASE WHEN rn = 4 THEN CodeNum END) 
     , [Code5] = max(CASE WHEN rn = 5 THEN CodeNum END) 
     , [Code6] = max(CASE WHEN rn = 6 THEN CodeNum END) 
FROM  
(
    SELECT GroupID 
    , rn = ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY ID) 
    , CodeNum 
    FROM Table1  
) q 
GROUP BY GroupID 

SQL Fiddle with Demo

당신은 내가 TOP 6를 제거하고 추가 것을 볼 참조 partition by GroupId. TOP을 사용하면 첫 번째 ID에 대한 값만 반환합니다. 파티션은 각 ID의 행을 리턴하지만 외부 선택은 처음 6 행만 리턴합니다. , SQL 서버의 버전에 따라, 이것은 또한 PIVOT 기능을 사용하여 작성 될 수

| GROUPID | CODE1 | CODE2 | CODE3 | CODE4 | CODE5 | CODE6 | 
---------------------------------------------------------------- 
|  1 | 111 | 222 | 333 | 444 | 555 | 666 | 
|  2 | 111 | 888 | (null) | (null) | (null) | (null) | 
|  3 | 999 | (null) | (null) | (null) | (null) | (null) | 

참고 :

는 결과 제공

select GroupID, 
    [1] as Code1, 
    [2] as Code2, 
    [3] as Code3, 
    [4] as Code4, 
    [5] as Code5, 
    [6] as Code6 
from 
(
    SELECT GroupID 
    , rn = ROW_NUMBER() OVER (PARTITION BY GroupID ORDER BY ID) 
    , CodeNum 
    FROM Table1  
) d 
pivot 
(
    max(codenum) 
    for rn in ([1], [2], [3], [4], [5], [6]) 
) piv; 

참조를 SQL Fiddle with Demo

관련 문제