reckey amt1 amt2 amt3 amt4 amt5ABCD1234 44.92 14.4 22 0 11.52
reckey amtnumber amtABCD1234 1 44.92ABCD1234 2 14.4ABCD1234 3 22 ABCD1234 4 0ABCD1234 5 11.52
SELECT reckey, ProductName, ProductQtyFROM (SELECT reckey = 'ABCD1234', amt1 = 44.92, amt2 = 14.4, amt3 = 22, amt4 = 0, amt5 = 11.52) dCROSS APPLY ( VALUES ('amt1', amt1), ('amt2', amt2), ('amt3', amt3), ('amt4', amt4), ('amt5', amt5)) x (ProductName, ProductQty)WHERE ProductQty IS NOT NULLSELECT reckey, ProductName, ProductQtyFROM (SELECT reckey = 'ABCD1234', amt1 = 44.92, amt2 = 14.4, amt3 = 22, amt4 = 0, amt5 = 11.52) dCROSS APPLY ( SELECT 'amt1', amt1 UNION ALL SELECT 'amt2', amt2 UNION ALL SELECT 'amt3', amt3 UNION ALL SELECT 'amt4', amt4 UNION ALL SELECT 'amt5', amt5) x (ProductName, ProductQty)WHERE ProductQty IS NOT NULL
--====== TEST DATA SET-UP =================if object_id('dbo.pvt') is not null drop table dbo.pvt;create table dbo.pvt(reckey varchar(10), amt1 decimal(8,2),amt2 decimal(8,2),amt3 decimal(8,2),amt4 decimal(8,2),amt5 decimal(8,2));insert dbo.pvt values ( 'ABCD1234', 44.92, 14.4, 22, 0, 11.52 );insert dbo.pvt values ( 'ABCD5678', 3.12, 17.7, 0, 13, 100.5 );/*I'm trying to use the t-sql Unpivot statement to create this:reckey amtnumber amtABCD1234 1 44.92ABCD1234 2 14.4ABCD1234 3 22 ABCD1234 4 0ABCD1234 5 11.52 */--====== SOLUTIONS =================-- SQL 2005: Unpivot the table.SELECT reckey, amtnumber, amtFROM (SELECT reckey, amt1, amt2, amt3, amt4, amt5 FROM pvt) pUNPIVOT (amt FOR amtnumber IN (amt1, amt2, amt3, amt4, amt5))AS unpvt;-- SQL 2008: You can use Cross Apply:SELECT reckey, amtnumber, amtFROM dbo.pvtCROSS APPLY ( VALUES (1, amt1) ,(2, amt2) ,(3, amt3) ,(4, amt4) ,(5, amt5) ) a(amtnumber, amt);
SELECT reckey, amtnumber, amtFROM (SELECT reckey, amt1 as [1], amt2 as [2], amt3 as [3], amt4 as [4], amt5 as [5] FROM pvt) pUNPIVOT (amt FOR amtnumber IN ([1], [2], [3], [4], [5]))AS unpvt;