2017-07-03 75 views
1

這對我來說似乎是一項微不足道的任務,但由於(可能)缺乏對擺動機制的理解,我無法找到解決方案。與相關列的樞軸表

我有樣本數據如下表:

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,但我可以忍受這一點。)

你能給我一個提示讓我去那裏嗎?這可能是我剛纔沒有正確解釋的東西...

+0

嘗試選擇'piv。*'。您選擇了'_active'列,但它們不是數據透視表的一部分。在'PIVOT'中未使用的FROM子句中的所有列將用於分組。另外,在我看來,你正試圖從源表中旋轉兩列。 'PIVOT'只支持一列通過聚合函數進行轉置。 – Aquillo

+0

啊哈!這樣做 - 感謝Aquillo!我怎樣才能在回答中標記你的評論,並給你信任? – kiro

+0

你不能,我已經發表我的評論作爲答案。很高興我能幫上忙! – Aquillo

回答

0

嘗試選擇piv.*。您選擇了_active列,但它們不是關鍵點的一部分。 FROM條款中PIVOT中未使用的所有列將用於分組。另外,在我看來,你正試圖從源表中旋轉兩列。 PIVOT只支持一列通過聚合函數進行轉置。