2017-05-24 18 views
0

我正在使用MS-SQLServer-2016,並且需要將行轉置爲列。 我使用Pivot和動態SQL選項來執行此操作,因爲行數是動態的。 圖1是我目前正在獲得的輸出。但客戶端不希望顯示這些NULL。他只希望顯示非空日期。 是否有辦法擺脫這些空值並僅顯示不同的日期?使用PiVOT進行列轉置的Microsoft SQL Server行

Figure1-Transpose_Output

與問候,

坦哈

DECLARE @columns AS NVARCHAR(MAX), @sql AS NVARCHAR(MAX), @var1 AS 
VARCHAR(MAX); 

SELECT @columns = stuff((select DISTINCT ',' + quotename(replace(replace(replace(n.action_note,' ','<>'),'><',''),'<>',' ')) 
         from engagement_action n, action_party m, personal p 
         where n.action_id = m.action_id 
          and p.party_id = m.party_id 
          and n.action_note like 'XXX' 
          and m.system_name = 'XXXXXXXXXXXX' 
          and p.customer_number = 'XXXXXXX' FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') 

SELECT @sql = 

       'select "RANK_IN_PROP" , 
       customer_number, 
       customer_shortname, 
       system_name, 
       '+ @columns + ' 
       from 
        (SELECT RANK() OVER (PARTITION BY convert(date,m.created_when) ORDER BY convert(date,m.created_when))"RANK_IN_PROP" , 
          p.customer_number, 
          p.customer_shortname, 
          m.system_name, 
          m.created_when , 
          convert(date,m.created_when) as created_when, 
          replace(replace(replace(n.action_note,'' '',''<>''),''><'',''''),''<>'','' '') as action_note1 
        FROM engagement_action n, action_party m, personal p 
        WHERE n.action_id = m.action_id 
        AND p.party_id = m.party_id 
        AND n.action_note like ''%XXX%'' 
        AND m.system_name = ''XXXXXXXXXXX'' 
        AND p.customer_number = ''XXXXXXXX'') d 
        PIVOT 
        (max(created_when) for action_note1 in (' + @columns + '))p order by created_when desc' 

execute(@sql);` 
+0

[不良習慣踢:使用舊式連接 - 伯特蘭·亞倫(http://sqlblog.com/blogs/aaron_bertrand/archive /2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) – SqlZim

+0

爲什麼不創建一個基於您正在使用的實際表的行結果集。 –

+0

您需要將'from(select ...)'減少到您想要'pivot()'的列以及要循環的列。然後加入你的'pivot()'的結果來添加所有其他列。 – SqlZim

回答

0

你可以試試這個,只是增加了(選擇不同action_note engagement_action其中action_note不爲空)在where子句。正如我不能創建測試數據,因此無法真正執行查詢

SELECT @columns = stuff((select DISTINCT ',' + 
quotename(replace(replace(replace(n.action_note,' ','<>'),'><',''),'<>',' ') 
) 
        from 
        (select distinct action_note engagement_action where action_note is not null) 
        n, action_party m, personal p 
        where n.action_id = m.action_id 
         and p.party_id = m.party_id 
         and n.action_note like 'XXX' 
         and m.system_name = 'XXXXXXXXXXXX' 
         and p.customer_number = 'XXXXXXX' FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'') 
+0

嗨Srinivasa饒,我試過了我得到相同的輸出。即使我在你所說的地方說明不同的action_note,當這些行被轉置時,我只會得到不同的列名。無論如何它不會影響日期。 –