将SQL列转置为行

时间:2018-10-24 21:14:57

标签: sql sql-server

我已经将数据摘录加载到虚拟表中,如下所示:

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

2 个答案:

答案 0 :(得分:1)

您可以使用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

答案 1 :(得分:1)

我将CROSS APPLYVALUES一起使用。

SELECT t1.IDNumber,v.LocationID,v.InventoryLevel
FROM [ID x Values] t1 
CROSS APPLY(
    VALUES(3001,t1.[3001]),(3013,t1.[3013]),(3020,t1.[3020])
) v(LocationID ,InventoryLevel)
where InventoryLevel <> ''

sqlfiddle