有没有一种方法可以使用t-sql创建列的“数据透视组”?

时间:2019-12-18 15:13:44

标签: sql sql-server tsql pivot

这似乎是一个普遍的需求,但是不幸的是,我找不到解决方案。

假设您有一个查询,输出以下内容:

| TimeFrame  | User       | Metric1 | Metric2 |
+------------+------------+---------+---------+
| TODAY      | John Doe   | 10      | 20      |
| MONTHTODAY | John Doe   | 100     | 200     |
| TODAY      | Jack Frost | 15      | 25      |
| MONTHTODAY | Jack Frost | 150     | 250     |

数据透视后,我需要作为输出的数据如下:

| User       | TODAY_Metric1 | TODAY_Metric2 | MONTHTODAY_Metric1 | MONTHTODAY_Metric2 |
+------------+---------------+---------------+--------------------+--------------------+
| John Doe   | 10            | 20            |100                 | 200                |
| Jack Frost | 15            | 25            |150                 | 250                |

请注意,我正在对TimeFrame进行数据透视,但是,列Metric1Metric2仍然是列,但按时间范围值分组。

这可以使用标准PIVOT语法完成吗,还是我需要编写一个更复杂的查询以将这些数据汇总到特定于我的需求的结果集中?

1 个答案:

答案 0 :(得分:4)

您可以通过条件聚合来做到这一点:

select
    user,
    sum(case when timeframe = 'TODAY' then Metric_1 end) TODAY_Metric1,
    sum(case when timeframe = 'TODAY' then Metric_2 end) TODAY_Metric2,
    sum(case when timeframe = 'MONTHTODAY' then Metric_1 end) MONTHTODAY_Metric1,
    sum(case when timeframe = 'MONTHTODAY' then Metric_2 end) MONTHTODAY_Metric2
from mytable
group by user

与供应商特定的实现相比,我倾向于选择条件聚合技术,因为:

  • 我发现它更易于理解和维护
  • 它是跨RDBMS(因此,如果需要,您可以轻松地将其移植到其他数据库)
  • 它通常表现良好,甚至优于供应商的实施(通常依赖于幕后的技术)
相关问题