2016-12-13 1 views
0

문제 배수가있을 경우 데이터에 대한 열을 사용하고자 공급자에 파일을 제출SQL의 PIVOT - 여러 동적 열

필요.

내가 만든 아래의 예와 같은 행으로 우리의 SQL DB 로그 '주장'

[email protected]  Number Type    Date      Value 
ABHX06HQ01 1  Escape Of Water  2009-05-01 00:00:00.000  840 
ABHX06HQ01 2  Escape Of Water  2009-05-06 00:00:00.000  400 
ABHX06HQ01 3  Escape Of Water  2010-02-01 00:00:00.000  304 
ABHX06HQ01 4  Storm Damage  2010-02-11 00:00:00.000  59 
ABHX06HQ01 5  Accidental Damage 2011-10-14 00:00:00.000  497 
ABHX06HQ01 6  Falling Trees  2011-09-29 00:00:00.000  1172 

내가 제출해야 파일이 그 주장의 각 행은 그래서 기본적으로 SQL의 열 열이 될 것을 요구 것 이동 :

ClaimNumber1, ClaimType1,   ClaimDate1,     ClaimValue1, ClaimNumber2, ClaimType2,   ClaimDate2,     ClaimValue2, ClaimNumber3, ClaimType3,   ClaimDate3,     ClaimValue3 
1    Escape Of Water  2009-05-01 00:00:00.000  840    2    Escape Of Water  2009-05-06 00:00:00.000  400    3    Escape Of Water  2010-02-01 00:00:00.000  304 

동적 열이 좋을지라도 이것은 최대 10 개가 될 수 있습니다. 비록 내가 어디서부터 시작해야할지 전혀 알지 못한다고해도, 나는 이것이 피봇이라고 생각한다.

각 숫자에 대해 UNION을 수행하면 시작되었지만 결국 결과가 나올 것 같지만 상당히 고풍스럽게 보입니다.

답변

1

PIVOT 연산자를 사용할 수 있지만 조건부 집계가 더 좋습니다.

이 기술은 하나 이상의 case expressions을 사용하여 행을 열로 나눕니다. group by 절은 집계 함수와 결합되어 최종 행 수를 줄입니다.

다음은 테이블의 처음 세 행을 사용하는 예입니다.

-- Rows to columns 
SELECT 
    PolRef, 
    CASE WHEN Number = 1 THEN [TYPE_ID] ELSE '' END AS Type_1, 
    CASE WHEN Number = 2 THEN [TYPE_ID] ELSE '' END AS Type_2, 
    CASE WHEN Number = 3 THEN [TYPE_ID] ELSE '' END AS Type_3 
FROM 
    YourTable 
GROUP BY 
    PolRef 
; 

반환과 같이

Polref x Type_1   Type_2   Type_3 
ABHX06HQ01 Escape Of Water 
ABHX06HQ01     Escape Of Water 
ABHX06HQ01         Escape Of Water 

에 의해 그룹을 추가하고 aggregation function :

-- Remove additional rows. 
SELECT 
    PolRef, 
    MAX(CASE WHEN Number = 1 THEN [TYPE_ID] ELSE '' END) AS Type_1, 
    MAX(CASE WHEN Number = 2 THEN [TYPE_ID] ELSE '' END) AS Type_2, 
    MAX(CASE WHEN Number = 3 THEN [TYPE_ID] ELSE '' END) AS Type_3 
FROM 
    YourTable 
GROUP BY 
    PolRef 
; 

행의 수를 감소 세에서 하나, 돌아왔다.

Polref x Type_1   Type_2   Type_3 
ABHX06HQ01 Escape Of Water Escape Of Water Escape Of Water 
+0

맨유는이 작업을 UNION을 사용하여 시작했고 결국에는 끔찍한보기로 끝났습니다.이 모든 것이 아래로 압축되었습니다. 아주 정확하고 정확한 답변을 해주셔서 감사합니다. – Lynchie

+0

문제 없습니다. 기쁜 데 도움이되었습니다. 필자는 피벗 연산자를 사용하는 것보다 코드에 더 빨리 접근 할 수 있습니다. 나는 종종 Excel 수식을 사용하여 케이스 표현을 생성합니다 (나는 같은 코드를 반복해서 다시 쓰지 않습니다!). –

+0

나는 동의한다 - 나는 PIVOT 's와 섞여서 나 자신을 얻는다. 그리고 나는 Excel Expression 앞에서 그것을 듣는다 - 정확하게 내가했던 것 – Lynchie