복붙노트

[SQL] T-SQL에서 피벗 데이터

SQL

T-SQL에서 피벗 데이터

나는 사람들의 그룹이 있습니다. A, B, C를 호출 할 수 있습니다. 나는 테이블이 그들이 매달 지불했다 얼마나 많은 쇼가 ....

PERSON|MONTH|PAID
A      JAN   10
A      FEB   20   
B      JAN   10   
B      FEB   20   
B      SEP   30   
C      JAN   10   
C      JUNE  20   
C      JULY  30   
C      SEP   40 

이 테이블 수와 년 동안 계속 않습니다 ..

테이블에서 (정말 피벗에있는이 일반적으로 이루어집니다 집계 할 필요가 참조로 아무것도)이 테이블을 피벗 없습니다 수있는 방법이 있나요 그 다음과 같습니다?

     JAN    FEB    MAR    APR    MAY    JUN    JUL    AGU    SEP
A    10     20
B    10     20     -      -      -      -      -      -      30
C    10     -      -      -      -      20     30     -      40

전에 이런 일에 실행하지만, 어떤 아이디어 일반적인 문제입니다 생각하지 적이 있습니까?

해결법

  1. ==============================

    1.당신은 SQL 서버 (위 또는) 2005를 사용하는 경우, 여기에 코드입니다 :

    당신은 SQL 서버 (위 또는) 2005를 사용하는 경우, 여기에 코드입니다 :

    DECLARE @cols VARCHAR(1000)
    DECLARE @sqlquery VARCHAR(2000)
    
    SELECT  @cols = STUFF(( SELECT distinct  ',' + QuoteName([Month])
                            FROM YourTable FOR XML PATH('') ), 1, 1, '') 
    
    
    SET @sqlquery = 'SELECT * FROM
          (SELECT Person, Month, Paid
           FROM YourTable ) base
           PIVOT (Sum(Paid) FOR [Person]
           IN (' + @cols + ')) AS finalpivot'
    
    EXECUTE ( @sqlquery )
    

    이 상관없이 당신이 얼마나 많은 다른 상태 작동하지 않습니다. 동적으로 PIVOT과 쿼리를 어셈블합니다. 동적 열이 PIVOT을 할 수있는 유일한 방법은 SQL 서버에서 수행 할 수 동적으로 쿼리를 조립하는 것입니다.

    다른 예 :

  2. ==============================

    2.항상 1 년에 12개월 있기 때문에 당신이 열 동적 번호를 필요로하는 이유는 확실하지 않다. 또한 귀하의 월 이름의 길이는 약간의 일관성을 보인다.

    항상 1 년에 12개월 있기 때문에 당신이 열 동적 번호를 필요로하는 이유는 확실하지 않다. 또한 귀하의 월 이름의 길이는 약간의 일관성을 보인다.

    샘플 결과 집합 :

    SELECT * FROM (SELECT 'A' [PERSON],'JAN' [MONTH],'10' [PAID]
    UNION SELECT 'A','FEB',20
    UNION SELECT 'B','JAN',10
    UNION SELECT 'B','FEB',20
    UNION SELECT 'B','SEP',30
    UNION SELECT 'C','JAN',10
    UNION SELECT 'C','JUNE',20
    UNION SELECT 'C','JULY',30
    UNION SELECT 'C','SEP',40) AS A
    PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p
    

    당신의 테이블에 대해이 될 것입니다 :

    SELECT [PERSON],[MONTH],[PAID]
    FROM [YOURTABLE]
    PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p
    

    당신이 일년에 열을 추가 할 경우는 다음과 같습니다 :

    SELECT * FROM (SELECT 'A' [PERSON],'JAN' [MONTH],'10' [PAID], 2011 [YEAR]
    UNION SELECT 'A','FEB',20, 2011
    UNION SELECT 'B','JAN',10, 2011
    UNION SELECT 'A','FEB',20, 2010
    UNION SELECT 'B','JAN',10, 2010
    UNION SELECT 'B','FEB',20,2011
    UNION SELECT 'B','SEP',30,2011
    UNION SELECT 'C','JAN',10,2011
    UNION SELECT 'C','JUNE',20,2011
    UNION SELECT 'C','JULY',30,2011
    UNION SELECT 'C','SEP',40,2011) AS A
    PIVOT (SUM([PAID]) FOR [MONTH] IN ([JAN],[FEB],[MARCH],[APRIL],[MAY],[JUNE],[JULY],[AUG],[SEP],[OCT],[NOV],[DEC])) p
    
  3. from https://stackoverflow.com/questions/7232593/pivot-data-in-t-sql by cc-by-sa and MIT license