2014-09-03 3 views
1

내가 무엇을해야하는지 명확히하는 데 도움이되기를 바랍니다. 필자는 본질적으로 날짜가있는 표를 읽고 나서이 날짜를 개별 열로 변환하려고합니다.MS SQL : 피벗 테이블 주문 열

불행히도 열이 잘못되었습니다. 이 열을 어떻게 주문합니까? | 01/01/2013 | 02/01/2013 | 기타? 모든 지침을 많이 주시면 감사하겠습니다.

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.GL_Effective_Date) 
      FROM [03_rdm].[Table_2013] c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT Ref_Account_Class, ' + @cols + ' from 
      (
       select TOP 100 PERCENT 
        Ref_Account_Class 
        , GL_Amount 
        , GL_Effective_Date 
       from [03_rdm].[Table_2013] 
       where Ref_Account_Class = ''Accounts Receivable'' 
       order by GL_Effective_Date 
      ) x 
      pivot 
      (
       max(GL_Amount) 
       for GL_Effective_Date in (' + @cols + ') 
      ) p ' 
execute(@query) 
+0

나는 이것을 시도했지만 오류가 발생했습니다. "SELECT DISTINCT가 지정된 경우 ORDER BY 항목이 선택 목록에 나타나야합니다." – Calgar99

+0

그래, 나쁘다. DISTINCT가 얼마나 엄격한 지 잊어 버렸습니다. DISTINCT 대신 GROUP BY를 사용해야합니다. – GarethD

답변

2

하는 당신은이 성명에서 주문해야하지만 별개 사용하는 경우

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.GL_Effective_Date) 
     FROM [03_rdm].[Table_2013] c 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

, 당신은 항목들만 순서는 할 수 목록을 선택하면 c.GL_Effective_Date으로 주문할 수 없으므로 완전한 진술이되어야합니다 (',' + QUOTENAME(c.GL_Effective_Date), 이후이후).은 암시 적으로 귀하의 날짜를 VARCHAR으로 변환하며 이는 순서대로 나오지 않습니다. 그래서 그 대신 DISTINCT의 당신은 중복을 제거하기 위해 GROUP BY을 사용할 수 있습니다 필요한 순서를 제공해야

SET @cols = STUFF((SELECT ',' + QUOTENAME(c.GL_Effective_Date) 
     FROM [03_rdm].[Table_2013] c 
     GROUP BY c.GL_Effective_Date 
     ORDER BY c.GL_Effective_Date 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

합니다. 아마도 눈에 띄지는 않겠지 만 이것은 또한 약간 더 효율적이어야합니다. 구별이있는 스. 라 함수를 g 용하면 모든 행에 함수가 적용되고 결과에서 중복이 제거되지만 그룹 by의 경우 첫 x 째 중복이 제거 된 후 함수에 결과가 적용됩니다. 언급 한 바와 같이, 이것은 QUOTENAME으로는 눈에 띄지 않지만 나중에 참조 할 수있는 유용한 지식이 될 것입니다.

+0

me.Much에 감사드립니다. – Calgar99

0

대신 distinct를 사용하는 group by를 사용

SET @cols = STUFF((SELECT ',' + QUOTENAME(c.GL_Effective_Date) 
        FROM [03_rdm].[Table_2013] c 
        GROUP BY c.GL_Effective_Date 
        ORDER BY c.GL_Effective_Date 
        FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)'), 
       1, 1, '');