I have a larger SQL that produces a similar output as this simplified example:
SELECT
5 AS L0,
2 AS L1,
3 AS L2,
4 AS L3
FROM DUAL
current output is this row:
| L0 | L1 | L2 | L3 |
| 5 | 2 | 3 | 4 |
desired output are this columns:
| kind | value |
| 0 | 5 |
| 1 | 2 |
| 2 | 3 |
| 3 | 4 |
I know I could get this by union the select 4 times. I'm looking for advice if union is the best I can do here and if this output can be achieved by other means.
I also found many examples to inverse a column to a row but here I'm looking for inversion from a row to column.
Please try UnPIVOT:
SELECT substr(kind,2,1) AS kind,"value" FROM
(
SELECT
5 AS l0,
2 AS l1,
3 AS l2,
4 AS l3
FROM dual
)temp unpivot include NULLS ("value" FOR kind IN (l0, l1 , l2, l3));
Inversely:
SELECT *
FROM
(
SELECT Kind,
max(Value) Value
FROM table
GROUP BY Kind
) PIVOT ( max(Value) FOR Kind IN (L0, L1, L2, L3) );
Assuming that you actually have a table to query from.
This does a Carteasan Product of your table and the "inline view." The inline view will output four rows, 1 through 4.
select i - 1 kind,
case when i = 1 then L0
when i = 2 then L1
when i = 3 then L2
when i = 4 then L3
end as value
from your_table,
(select level as i from dual connect by level <= 4)
来源:https://stackoverflow.com/questions/5301613/inverse-row-to-column