2014-06-18 91 views
0

我有以下查詢動態轉動一些行的信息:行進行排序

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

    select @cols = STUFF((SELECT ',' + QUOTENAME(convert(char(50), ScheduleEndTime, 120)) 
        FROM metersNotRead 
        group by ScheduleEndTime 
        order by ScheduleEndTime DESC 
        FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'') 

    set @query = 'SELECT ScheduleName, MeterID, CurrentGK, 
       ' + @cols + ' from 
       (
        select ScheduleName, MeterID, CurrentGK, ScheduleEndTime, ''Y'' flag 
        from metersNotRead 
       ) x 
       pivot 
       (
        max(flag) 
        for ScheduleEndTime in (' + @cols + ') 
       ) p 
       order by ' + @cols +' DESC 
     ' 

    execute(@query) 

它給了我正確的結果,但我想知道我怎麼可以通過第一動態列行進行排序,然後第二個,依此類推,直到所有動態列都被排序爲止。

我有現在的結果是這樣的:

ScheduleName MeterID CurrentGK FirstDynamicCol SecondDynamicCol ETC 
textName1  exampleID1 --   NULL    Y     
taxtName2  exampleID2 --   Y     NULL     

我想他們是這樣的:

ScheduleName MeterID CurrentGK FirstDynamicCol SecondDynamicCol ETC 
textName2  exampleID2 --   Y     NULL     
taxtName1  exampleID1 --   NULL    Y     

回答

0

試試這個,在其自己的變量把你的第一個列名,和訂單僅此。

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

select @orderby = STUFF((SELECT ',' + QUOTENAME(convert(char(50), ScheduleEndTime, 120)) + ' desc' 
       FROM metersNotRead 
       group by ScheduleEndTime 
       order by ScheduleEndTime DESC 
       FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
       ,1,1,'') 

select @cols = STUFF((SELECT ',' + QUOTENAME(convert(char(50), ScheduleEndTime, 120)) 
       FROM metersNotRead 
       group by ScheduleEndTime 
       order by ScheduleEndTime DESC 
       FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
       ,1,1,'') 

set @query = 'SELECT ScheduleName, MeterID, CurrentGK, 
      ' + @cols + ' from 
      (
       select ScheduleName, MeterID, CurrentGK, ScheduleEndTime, ''Y'' flag 
       from metersNotRead 
      ) x 
      pivot 
      (
       max(flag) 
       for ScheduleEndTime in (' + @cols + ') 
      ) p 
      order by ' + @orderby 


execute(@query) 
+0

謝謝@JiggsJedi讓我更接近我需要的東西。但是,我真的希望它按所有動態列排序。如果這些列是'2014-06-19''2014-06-18''2014-06-17'我希望order by子句是'order by'2014-06-19'DESC',2014-06 -18'DESC,'2014-06-17'DESC「。我使用'select cols'中的代碼爲所有動態列設置'select orderby',但我不確定如何在每列之後獲得'DESC'。 – cj1689262

+0

已被更新回答。如果它不正確,在設置它之後立即查看它正在用PRINT @ ORDERBY進行的操作(只需運行到那裏),然後可以根據需要調整它。 – JiggsJedi

+0

非常完美!儘管我不得不從代碼的查詢部分刪除'DESC',否則由於額外的'DESC',我得到了語法錯誤。我更新了您的代碼並已接受您的答案。感謝您的幫助! – cj1689262