sql - 有没有办法用 t-sql 创建列的“枢轴组”?
问题描述
这似乎是一种常见的需求,但不幸的是,我找不到解决方案。
假设您有一个输出以下内容的查询:
| 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(因此如果需要,您可以轻松地将其移植到其他数据库)
- 它通常表现得一样好,甚至比供应商实现更好(通常依赖于它)
推荐阅读
- spring-boot - 为什么我的 Spring Boot 应用程序没有在 mustache 模板中呈现 messages.properties
- java - 为什么我使用 ObjectInputStream.readObject() 得到 ClassNotFoundException?
- python - 如何导入python脚本并将参数传递给主函数
- c# - 如何在我的应用程序后台初始化 UrhoSharp?
- css - WordPress 主题上的水平滚动仅在 Firefox 上
- visual-studio - SSIS 项目:[文件] 无法打开或加载,因为它已在另一个项目或解决方案中打开或加载
- python - 不允许使用属性 debugOptions
- python - 按时间间隔分列并计算总和
- javascript - Chrome 存储同步设置并无法正常工作
- javascript - 如何在我网站上的页面之间发送数据