Db2 convert rows to columns

2019-08-29 04:49发布

问题:

I need the below results ..

Table :

Order postcode qnty
123    2234        1

Expected result:

Order          123
Postcode       2234
Qnty           1

SQL server:

Select pvt.element_name
      ,pvt.element_value(select order.postcode
                         from table name)up
unpivot (element_value for element_name in(order,postcode) as Pvt

How to achieve this in db2?

回答1:

Db2 for IBM i doesn't have a built-in unpviot function.. AFAIK, it's not available on any Db2 platofrm...unless it's been added recently.

The straight forward method

select 'ORDER' as key, order as value 
from mytable
UNION ALL
select 'POSTCODE', postcode
from mytable
UNION ALL
select 'QNTY', char(qnty)
from mytable;

A better performing method is to do a cross join between the source table and a correlated VALUES of as many rows as columns that need to be unpivoted.

select 
   Key, value
from mytable T,
      lateral (values ('ORDER', t.order)
                      , ('POSTCODE', t.postcode) 
                      , ('QNQTY', varchar(t.qnty))
                      ) as unpivot(key, value);

However, you'll need to know ahead of time what the values you're unpivoting on.

If you don't know the values, there are some ways to unpivot with the XMLTABLE (possibly JSON_TABLE) that might work. I've never used them, and I'm out of time to spend answering this question. You can find some examples via google.



回答2:

I have created a stored procedure for LUW that rotate a table: https://github.com/angoca/db2tools/blob/master/pivot.sql

You just need to call the stored procedure by passing the tablename as parameter, and it will return a cursor with the headers of the column in the first column.



标签: db2 db2-400