sql - 有没有办法用 t-sql 创建 "pivot group"列?

标签 sql sql-server t-sql group-by 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 语法中完成吗?还是我需要编写一个更复杂的查询来将这些数据集中到一个特定于我的需求的结果集中?

最佳答案

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

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/

相关文章:

sql - PIVOT 并插入每 N 行

sql - MySQL:如何 SUM() a TIMEDIFF() on a group?

mysql - 在mysql中获取学生的相关科目

sql - 如何在存储过程中设置日期时间可选参数?

sql-server - IDENTITY 列重置编号

t-sql - 具有多个相似子查询的sproc的SQL优化

sql-server - 更改 SQL Server 中列的数据类型

java - Hibernate 从外部事务类中的 getCurrentPrice 返回 null

sql - 如何根据 HiveQL 和 SQL 中特定列的子字符串进行选择?

sql - 为什么在使用数据库邮件时出现以下错误 -> 过程 sysmail_verify_profile_sp,配置文件名称无效?