這對我來說似乎是一項微不足道的任務,但由於(可能)缺乏對擺動機制的理解,我無法找到解決方案。與相關列的樞軸表
我有樣本數據如下表:
id code created_datetime sourceID
------ ---- ------------------- --------
481792 DEF 2016-12-04 18:31:00 398464
481792 JKH 2016-12-04 18:31:00 398464
486429 ABC 2010-09-07 09:29:00 302304
486429 DEF 2009-02-05 03:04:00 320903
486429 GHI 2009-02-05 03:04:00 320903
我想獲得的結果是一個支點上的「代碼」列中,是否存在一個此代碼指示ID。列'created_datetime'我試圖用SELECT DATEDIFF(DAY,created_datetime,CURRENT_TIMESTAMP)轉換爲迄今爲止的天數 - 最後是sourceID。我有這樣的想法結果(我真的希望這是正確的格式):
id ABC ABC_sou ABC_days_active DEF DEF_sou DEF_days_active GHI GHI_sou GHI_days_active JKH JKH_sou JKH_days_active
------ --- ------- --------------- --- ------- --------------- --- ------- --------------- --- ------- ---------------
481792 0 1 398464 211 1 398464 211
486429 1 302304 2491 1 320903 3070 1 320903 3070
一行公關。 ID,就是。
我迄今爲止嘗試,沒有相當到達那裏,由該鏈接的啓發:PIVOT on Multiple Columns,這裏使用的例子,我想出了這個:
select id,
[ABC], [ABC_source], [ABC_days_active],
[DEF], [DEF_source], [DEF_days_active],
[GHI], [GHI_source], [GHI_days_active],
[JKH], [JKH]_source], [JKH_days_active]
from
(
SELECT id,
code,
source,
col, value
FROM MyTable
cross apply
(
values
([code], CASE code WHEN NULL THEN 0 ELSE 1 END),
([code]+'_source', [source]),
([code]+'_date', CAST(DATEDIFF(DAY,created_datetime,CURRENT_TIMESTAMP) AS varchar (20)))
) c (col, value)
) d
pivot
(
max(value)
for col in ([ABC], [ABC_source], [ABC_date], [DEF], [DEF_source], [DEF_date],
[GHI], [GHI_source], [GHI_date], [JKH], [JKH_source], [JKH_date])
) piv;
這給了我正確的列(列名稱),但我仍然擁有與我開始時相同的行數。 (此外,0將只顯示爲NULL,但我可以忍受這一點。)
你能給我一個提示讓我去那裏嗎?這可能是我剛纔沒有正確解釋的東西...
嘗試選擇'piv。*'。您選擇了'_active'列,但它們不是數據透視表的一部分。在'PIVOT'中未使用的FROM子句中的所有列將用於分組。另外,在我看來,你正試圖從源表中旋轉兩列。 'PIVOT'只支持一列通過聚合函數進行轉置。 – Aquillo
啊哈!這樣做 - 感謝Aquillo!我怎樣才能在回答中標記你的評論,並給你信任? – kiro
你不能,我已經發表我的評論作爲答案。很高興我能幫上忙! – Aquillo