Try this out
DECLARE @Tmp TABLE (OrderID INT, Meta_Key varchar(16), Meta_Value INT)
INSERT @Tmp
VALUES (1 ,'product_id', 101)
, (1 ,'qty', 1)
, (1 ,'total', 20)
, (2 ,'product_id', 105)
, (2 ,'qty', 2)
, (2 ,'total', 100)
, (3 ,'product_id', 102)
, (3 ,'qty', 1)
, (3 ,'total', 30)
DECLARE @Tmp2 TABLE (OrderID INT, ProductID INT, Qty INT, Total INT)
INSERT @Tmp2 (OrderID) SELECT Distinct OrderID FROM @Tmp
UPDATE n
SET n.ProductID = P.Meta_Value
, n.Qty = Q.Meta_Value
, n.Total = t.Meta_Value
FROM @Tmp2 n
INNER JOIN @Tmp p ON n.OrderID = p.OrderID AND p.Meta_Key = 'product_id'
INNER JOIN @Tmp q ON n.OrderID = q.OrderID AND q.Meta_Key = 'qty'
INNER JOIN @Tmp t ON n.OrderID = t.OrderID AND t.Meta_Key = 'Total'
SELECT * FROM @Tmp2
You probably could do this with a
PIVOT
and subqueries, but this schema is simple enough to do this way