从 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的主要内容,如果未能解决你的问题,请参考以下文章