从 sql 表中进行复杂的 unpivot

Posted

技术标签:

【中文标题】从 sql 表中进行复杂的 unpivot【英文标题】:Complex unpivot from sql table 【发布时间】:2017-02-08 08:21:42 【问题描述】:

我有一张包含各种列的表格。 让我们这样说:

姓名 |型号 |第 1 年 |组1 |第 2 年 |组2 |第 3 年 |组3 |第四年 |组4

所有行都在 Name 和 Model 中获取数据。

所有的行都得到了year1和group1的数据,

有些行得到了year1 group1和year2 group2中的数据,

有些行得到了year1 group 1和year2 group2和year3 group3中的数据,

等等……

如果没有数值较低的组,就不可能在数值较大的组中包含数据。 示例:如果没有第 2 年和第 1 年的数据,则不能在第 3 年第 3 组中有数据。

我的问题如下,

我需要将所有这些值取消透视到单独的行中。 所以最终的结果会是这样的:

姓名 |型号 |年份 |组

附: 例如,如果 year4 group4 列中没有值,则它们被定义为 NULL。

我使用的是 MSSQL 服务器 2016。

【问题讨论】:

UNION ALL 是一个好的开始。 【参考方案1】:

你可以用这个

SELECT name, model, year1 AS [year], 'group1' AS [group]
FROM table_name
WHERE group1 IS NOT NULL
UNION ALL
SELECT name, model, year2, 'group2'
FROM table_name
WHERE group2 IS NOT NULL
UNION ALL
SELECT name, model, year3, 'group3'
FROM table_name
WHERE group3 IS NOT NULL
UNION ALL
SELECT name, model, year4, 'group4'
FROM table_name
WHERE group4 IS NOT NULL;

您可以考虑在所有 4 个 SELECT 语句中为每个组的值添加一列:groupx AS value

SELECT name, model, year1 AS [year], group1 AS value, 'group1' AS [group]
FROM table_name
WHERE group1 IS NOT NULL
UNION ALL
SELECT name, model, year2, group2, 'group2'
FROM table_name
WHERE group2 IS NOT NULL
UNION ALL
SELECT name, model, year3, group3, 'group3'
FROM table_name
WHERE group3 IS NOT NULL
UNION ALL
SELECT name, model, year4, group4, 'group4'
FROM table_name
WHERE group4 IS NOT NULL;

【讨论】:

以上是关于从 sql 表中进行复杂的 unpivot的主要内容,如果未能解决你的问题,请参考以下文章

用于从具有复杂结构的表中选择数据的 sql 查询

1 小时 SQL 极速入门

1 小时 SQL 极速入门

从 SQL Server 表中选择 n 个随机行

SQL Query (SQL Server 2008) 从两个表中检索数据并对结果进行分组

如何从sql中的四个表中进行选择?