我已经将数据摘录加载到虚拟表中,如下所示:
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
答案 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 APPLY
与VALUES
一起使用。
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 <> ''