首页 > 解决方案 > 有没有办法用 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                |

请注意,我正在对TimeFrameMetric1Metric2保持列进行旋转,但按时间范围值分组。

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

标签: sqlsql-servertsqlgroup-bypivot

解决方案


您可以使用条件聚合来做到这一点:

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(因此如果需要,您可以轻松地将其移植到其他数据库)
  • 它通常表现得一样好,甚至比供应商实现更好(通常依赖于它)

推荐阅读