这似乎是一个常见的需求,但不幸的是,我找不到解决方案。
假设您有一个输出以下内容的查询:
| 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
语法中完成吗?还是我需要编写一个更复杂的查询来将这些数据集中到一个特定于我的需求的结果集中?
最佳答案
您可以通过条件聚合来做到这一点:
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 的(因此您可以根据需要轻松将其移植到其他数据库)
- 它的性能通常与供应商实现一样好,甚至更好(通常在幕后依赖它)
关于sql - 有没有办法用 t-sql 创建 "pivot group"列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59394981/