SQL Server 2008 R2 - 将列转换为行并将所有值放在一列中

Posted

技术标签:

【中文标题】SQL Server 2008 R2 - 将列转换为行并将所有值放在一列中【英文标题】:SQL Server 2008 R2 - converting columns to rows and have all values in one column 【发布时间】:2018-03-14 06:40:17 【问题描述】:

我很难理解枢轴/非枢轴概念,并希望有人可以帮助我或就如何解决我的问题给我一些指导。

这是我的简化示例表

+-------+------+------+------+------+------+
| SAUID | COM1 | COM2 | COM3 | COM4 | COM5 |
+-------+------+------+------+------+------+
| 1     | 24   | 22   | 100  | 0    | 45   |
| 2     | 34   | 55   | 789  | 23   | 0    |
| 3     | 33   | 99   | 5552 | 35   | 4675 |
+-------+------+------+------+------+------+

我正在寻找的最终结果类似于下面的表格结果

+-------+-----------+-------+
| SAUID | OCCUPANCY | VALUE |
+-------+-----------+-------+
| 1     | COM1      | 24    |
| 1     | COM2      | 22    |
| 1     | COM3      | 100   |
| 1     | COM4      | 0     |
| 1     | COM5      | 45    |
| 2     | COM1      | 34    |
| 2     | COM2      | 55    |
| 2     | COM3      | 789   |
| 2     | COM4      | 23    |
| 2     | COM5      | 0     |
| 3     | COM1      | 33    |
| 3     | COM2      | 99    |
| 3     | COM3      | 5552  |
| 3     | COM4      | 35    |
| 3     | COM5      | 4675  |
+-------+-----------+-------+

我正在环顾四周,但大多数示例似乎都使用了 pivot,但很难尝试将其包裹在我的案例中,因为我需要将值全部放在一列中。

我希望尝试一些硬编码来与我的示例相似,但我的实际表列约为 100,每个表的 SAUID #s 不同,并且看起来需要动态 sql?

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

使用UNPIVOT

SELECT u.SAUID, u.OCCUPANCY, u.VALUE
FROM yourTable t
UNPIVOT
(
    VALUE for OCCUPANCY in (COM1, COM2, COM3, COM4, COM5)
) u;
ORDER BY
    u.SAUID, u.OCCUPANCY;

Demo

【讨论】:

以上是关于SQL Server 2008 R2 - 将列转换为行并将所有值放在一列中的主要内容,如果未能解决你的问题,请参考以下文章

如何在SQL Server 2008R2中查找未使用的列

转换 SQL Server 2008 R2 和 2012 之间的差异

在 SQL Server 2008 R2 中将 varchar 转换为时间戳

SQL Server 2008 R2 数据类型转换错误

如何在 Sql Server 2008 R2 中将列转换为行?

Sql Server 2008 R2 - SSMA 转换的扩展过程调用(IMPL 过程)影响性能