这似乎是一个普遍的需求,但是不幸的是,我找不到解决方案。
假设您有一个查询,输出以下内容:
| 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
进行数据透视,但是,列Metric1
和Metric2
仍然是列,但按时间范围值分组。
这可以使用标准PIVOT
语法完成吗,还是我需要编写一个更复杂的查询以将这些数据汇总到特定于我的需求的结果集中?
答案 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
与供应商特定的实现相比,我倾向于选择条件聚合技术,因为: