2017-07-03 72 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只支持一列通过聚合函数进行转置。