首页 > 解决方案 > 将 SQL 列转置为行

问题描述

我已将数据提取加载到一个虚拟表中,如下所示:

CREATE TABLE [dbo].[ID x Values](
    IDNumber [varchar](50) NULL,
    [3001] [varchar](50) NULL,
    [3013] [varchar](50) NULL,
    [3020] [varchar](50) NULL
)

INSERT INTO [dbo].[ID x Values]
           ([IDNumber]
           ,[3001]
           ,[3013]
           ,[3020])
Values('1111', '1', '', ''),
('2222', '', '2', ''),
('3333', '23', '', '4'),
('4444', '1', '', '2')

第一列是项目 ID。以下列是一些虚拟物品的 locationID 和库存水平。即项目 ID 1111 在位置 3001 有 1 个库存项目,在 3013 有 0 个单位,在 3020 有 0 个单位。

我在编写查询以将这些列转换为单行记录时遇到了一些麻烦。我正在寻找的结果是这样的:

ItemID   LocationID   InventoryLevel
-------  -----------  ---------------
1111     3001         1
2222     3013         2
3333     3001         23
3333     3020         4
4444     3001         1
4444     3020         2

标签: sqlsql-server

解决方案


您可以使用UNPIVOT来获得所需的输出

SELECT
    IDNumber AS ItemID,
    LocationID,
    InventoryLevel
FROM [dbo].[ID x Values]
    UNPIVOT (InventoryLevel FOR LocationID IN ([3001], [3013], [3020])) UNPVT
WHERE LEN(InventoryLevel) > 0

推荐阅读