我正在使用MS-SQLServer-2016,並且需要將行轉置爲列。 我使用Pivot和動態SQL選項來執行此操作,因爲行數是動態的。 圖1是我目前正在獲得的輸出。但客戶端不希望顯示這些NULL。他只希望顯示非空日期。 是否有辦法擺脫這些空值並僅顯示不同的日期?使用PiVOT進行列轉置的Microsoft SQL Server行
與問候,
坦哈
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);`
[不良習慣踢:使用舊式連接 - 伯特蘭·亞倫(http://sqlblog.com/blogs/aaron_bertrand/archive /2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) – SqlZim
爲什麼不創建一個基於您正在使用的實際表的行結果集。 –
您需要將'from(select ...)'減少到您想要'pivot()'的列以及要循環的列。然後加入你的'pivot()'的結果來添加所有其他列。 – SqlZim