2013-09-25 2 views
2

생성 된 열의 순서가 잘못되어 다음과 같은 SQL 쿼리를 사용하여이를 수정하는 방법을 잘 모릅니다.동적 피벗의 열 정렬

SELECT rhead.rhcust AS [Cust ID], rdetl.rdextp AS [Inv Amt], rhead.rhivdt AS [Inv Date] 
INTO #TempTable 
FROM rhead 
LEFT OUTER JOIN rdetl 
    ON rhead.rhinvc = rdetl.rdinvc 
WHERE rhead.rhivdt >= '01-01-2012' AND rhead.rhivdt <= '12-25-12' 

ALTER DATABASE Vista_TM SET COMPATIBILITY_LEVEL = 100 

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Month'+cast(DATEPART(m, [Inv Date]) as varchar(2))) 
        from #TempTable 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

set @query = 'SELECT [Cust ID],' + @cols + ' 
      from 
      (
       SELECT [Cust ID], [Inv Amt], 
        ''Month''+cast(DATEPART(m, [Inv Date]) as varchar(2)) MonthNo 
       FROM #TempTable 
      ) x 
      pivot 
      (
       sum([Inv Amt]) 
       for MonthNo in (' + @cols + ') 
      ) p ' 

execute(@query) 

DROP TABLE #TempTable 

가 나는 쿼리의이 부분에 뭔가를 가지고 있다고 생각합니다 :

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Month'+cast(DATEPART(m, [Inv Date]) as varchar(2))) 
        from #TempTable 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

나는이 topic에 게시 대답과 함께 장난 시도해 봤어하지만 난 쿼리를 실행할 수 없습니다. 나는 누군가가 도울 수 있기를 바라고 있습니다.

편집 내 행이 고장난 것으로 나타 났으며 [고객 ID]로도 정렬하고 싶습니다.

+0

당신의 생각이 옳다, 당신은 단지 DATEPART에 의해'ORDER를 추가 할 수 있습니다 (m, [인보이스 날짜])'#의 TempTable''후하지만 전에'XML 경로 ('')'. 관련이 없으며 중요하지 않은 메모에서 'EXECUTE (@Query)', [Aaron Bertrand] (http://stackoverflow.com/users/) 대신 'EXECUTE SP_EXECUTESQL @ Query'를 사용하는 것이 더 좋습니다. 61305 /)도 [블로그에 대해] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/17/bad-habits-to-kick-using-exec-instead-of-sp-executesql .aspx) 그의 나쁜 습관 시리즈 킥. – GarethD

답변

6

당신이 당신의 @cols 문자열을 설정할 때이 ORDER BY를 추가하여 동적 피벗 쿼리의 필드의 순서를 조정할 수 있습니다

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Month'+cast(DATEPART(m, [Inv Date]) as varchar(2))) 
        from #TempTable 
        ORDER BY .... 
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

업데이트 : DISTINCT를 사용하는 경우 처음에는 DISTINCT을 부재를, 당신은 할 수 있습니다 하위 쿼리 다음 ORDER BY을 사용 :

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(ColName) 
        FROM (SELECT DISTINCT 'Month'+cast(DATEPART(m, [Inv Date]) as varchar(2)) ColName 
          FROM #TempTable 
         )sub 
        ORDER BY ColName 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

당신은 단순히 열 이름을 사용할 수없는 경우 하위 쿼리에 '종류'필드를 추가해야 할 수도 있습니다, 그리고 당신은의 모든 필드를 추가 할 수 있습니다 ubquery는 DISTINCT 목록을 방해하지 않는 한 오래 사용할 수 있습니다. 예를 들어 :

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(ColName) 
        FROM (SELECT DISTINCT 'Month'+cast(DATEPART(m, [Inv Date]) as varchar(2)) ColName 
              ,CASE WHEN field = 'something' THEN 1 
               WHEN field = 'something else' THEN 2 
               ELSE 3 
              END as Sort 
              ,Cust_ID 
          FROM #TempTable 
         )sub 
        ORDER BY Sort,Cust_ID 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 
+0

내 특정 예제에서는 ORDER BY'[Inv Date]'와'QUOTENAME' 두 가지 중 어느 것도 작동하지 않았고 SELECT DISTINCT가 지정되어 있으면 _ORDER BY 항목이 선택 목록에 나타나야한다는 오류 메시지가 표시됩니다 ._ [Inv Amt]' – Matt

+0

@Matt 처음에는 DISTINCT를 놓치 셨습니다. 업데이트를 참조하십시오. –

+0

감사합니다! 불행히도 저는 개월 단위로 10 월 11 일 12 월이 1 월 이후에 나타납니다. – Matt