带有相关列的数据透视表

时间:2017-07-03 10:31:22

标签: tsql pivot

在我看来,这是一项微不足道的任务,但由于(可能)缺乏对枢轴机制的理解,我无法找到解决方案。

我的下表包含样本数据:

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

一行pr。 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,但我可以接受它。)

你可以给我一个提示让我到那里吗?这可能是我没有正确解释的......

1 个答案:

答案 0 :(得分:0)

尝试选择piv.*。您选择了_active列,但它们不是数据透视图的一部分。来自FROM - 子句的PIVOT - 中未使用的所有列都将用于分组。此外,在我看来,您正在尝试从源表中转动两列。 PIVOT仅支持一列通过聚合函数进行转动。

相关问题