SQL 中的数据透视表,但将度量名称保留在列中

Posted

技术标签:

【中文标题】SQL 中的数据透视表,但将度量名称保留在列中【英文标题】:Pivot table in SQL but keep measure names in column 【发布时间】:2020-09-04 12:57:24 【问题描述】:

我无法正确旋转表格。

我的输入是这个原始数据表:

+------+---------+------------+----------+
| YEAR | FACULTY | ADMISSIONS | DROPOUTS |
+------+---------+------------+----------+
| 2018 | LAW     |         15 |        2 |
| 2019 | LAW     |         18 |        4 |
| 2020 | LAW     |         11 |        1 |
| 2018 | MATH    |         19 |        1 |
| 2019 | MATH    |         17 |        6 |
| 2020 | MATH    |         24 |        5 |
+------+---------+------------+----------+

我想将年份转为行,但我也想将录取和辍学的度量保留为行名称。例如,我想要一个这样的表:

+---------+------------+------+------+------+
| FACULTY |  MEASURE   | 2018 | 2019 | 2020 |
+---------+------------+------+------+------+
| LAW     | ADMISSIONS |   15 |   18 |   11 |
| LAW     | DROPOUTS   |    2 |    4 |    1 |
| MATH    | ADMISSIONS |   19 |   17 |   24 |
| MATH    | DROPOUTS   |    1 |    6 |    5 |
+---------+------------+------+------+------+

我可以使用以下方法调整年份:

SELECT * 
FROM 
    (
        SELECT FACULTY, YEAR, ADMINISSION, DROPPUTS 
        FROM TABLE
        PIVOT (SUM (ADMISSIONS) 
        FOR YEAR IN (2018,2019,2020)
    )

但我需要旋转这两个度量并仍然获得度量名称列。有什么想法吗?

【问题讨论】:

用您正在使用的数据库标记您的问题。 【参考方案1】:

这是不旋转的,然后是旋转的。如果你的数据库支持横向连接和values(),你可以这样做:

select
    t.faculty,
    x.measure,
    sum(case when t.year = 2018 then x.value end) value_2018,
    sum(case when t.year = 2019 then x.value end) value_2019,
    sum(case when t.year = 2020 then x.value end) value_2020
from mytable t
cross apply (values ('admission', admission), ('dropout', dropout)) as x(measure, value)
group by t.faculty, x.measure

【讨论】:

【参考方案2】:

我会使用 apply 取消透视(假设您使用的是 SQL Server)并重新聚合:

select t.faculty, v.measure,
       max(case when year = 2018 then val end) as [2018],
       max(case when year = 2019 then val end) as [2019],
       max(case when year = 2020 then val end) as [2020]
from t cross apply
     (values ('ADMISSIONS', ADMISSIONS), ('DROPOUTS', DROPOUTS)
     ) v(measure, val)
group by t.faculty, v.measure

【讨论】:

以上是关于SQL 中的数据透视表,但将度量名称保留在列中的主要内容,如果未能解决你的问题,请参考以下文章

分解表以在列中进行透视(SQL,PYSPARK)

如何从以 BLOB 类型存储在列中的 XML 中提取数据(通过 SQL 查询)

在 OBIEE 中将总计添加到数据透视表行的末尾

SQL - BigQuery - 在多个列中使用 Group 和 MAX - 类似于数据透视表

动态(变量)数据库表名与存储在列中的变量

SQL中PIVOT 行列转换