在select语句中将少数列转换为行



我有一个这样的表:

-----------------------------------------------------------------
| ID |  ItemName | OldValue | newValue |  OrderId  | sequenceNo
-----------------------------------------------------------------
| 1 |  Item1   |   1     | 1.5     |  SO2   |   6
| 2 |  Item2   |   4     | 6       |  SO2   |   4
| 3 |  Item3   |   3     | 68      |  SO2    |  9 
------------------------------------------------------------------

我必须写一个查询,其中OldValue列数据应该像下面的例子一样作为新行

ItemName | allValues   |OrderId  | sequenceNo
----------------------------------------------
Item1   |   1          |  SO2   |   0
Item2   |   4          |  SO2   |   0
Item3   |   3          |  SO2   |   0
Item1   |   1.5        |  SO2   |   6
Item2   |   6          |  SO2   |   4
Item3   |   68         |  SO2   |   9
-----------------------------------------------

我使用了一个UNION,在这里我写了

select itemName , oldValue as allValues , OrderId from Orderdetails
UNION
select itemName , newValue as allValues , OrderId from Orderdetails

有没有更好的方法不用UNION来写这个?

可以使用VALUES子句来执行UNPIVOT

select t.itemname,
u.allvalues,
t.orderid,
u.sequenceno
from the_table t
cross join lateral (
values (oldvalue, 0), (newvalue, t.sequenceno)
) as u(allvalues, sequenceno)
order by t.itemname;

最新更新