db2数据库中的行转列和列转行

一、行转列


给出下面的数据:
CREATE TABLE Sales (Year INT, Quarter INT, Results INT)

YEAR        QUARTER     RESULTS
----------- ----------- -----------
2004           1          20
2004           2          30
2004           3          15
2004           4          10
2005           1          18
2005           2          40
2005           3          12
2005           4          27
想要的到结果:
YEAR        Q1          Q2          Q3          Q4
----------- ----------- ----------- ----------- -----------
2004          20          30          15          10
2005          18          40          12          27
这个SQL就可解决这个问题:
SELECT Year,
       MAX(CASE WHEN Quarter = 1
           THEN Results END) AS Q1,
       MAX(CASE WHEN Quarter = 2
           THEN Results END) AS Q2,
       MAX(CASE WHEN Quarter = 3
           THEN Results END) AS Q3,
       MAX(CASE WHEN Quarter = 4
           THEN Results END) AS Q4
FROM Sales
GROUP BY Year
解释一下为什么要加max的原因,因为不加max的话结果会是这样:
YEAR        Q1          Q2          Q3          Q4
----------- ----------- ----------- ----------- -----------
2004          20           -           -           -
2004           -          30           -           -
2004           -           -          15           -
2004           -           -           -          10
2005          18           -           -           -
2005           -          40           -           -
2005           -           -          12           -
2005           -           -           -          27

 

二、列转行

给出下面数据

CREATE TABLE SalesAgg
(  year INTEGER,
   q1 INTEGER,
   q2 INTEGER,
   q3 INTEGER,
   q4 INTEGER );

YEAR        Q1          Q2          Q3          Q4
----------- ----------- ----------- ----------- -----------
2004          20          30          15          10
2005          18          40          12          27

想要的结果
YEAR        QUARTER     RESULTS
----------- ----------- -----------
2004           1          20
2004           2          30
2004           3          15
2004           4          10
2005           1          18
2005           2          40
2005           3          12
2005           4          27

这个SQL就可以实现:

SELECT S.Year, Q.Quarter, Q.Results
FROM SalesAgg AS S,
     TABLE (VALUES(1, S.q1),
                  (2, S.q2),
                  (3, S.q3),
                  (4, S.q4))
            AS Q(Quarter, Results);

 每个values中对应列的数据类型必须相同,值可以任意,如1,2,3,4都是整形

下面解释一下执行的过程:
核心是用table函数创建了一个表,Q是创建的视图名,这个表是用values实现的多行表,values实现虚表的例子:

db2 => select * from (values (1,2),(2,3)) as t1(col1,col2)

COL1        COL2
----------- -----------
 1           2
 2           3

  2 条记录已选择。

db2 => select * from (values 1) as a

1
-----------
          1

1 条记录已选择。
 

所不同的是这里跟from子句中的一个表产生了关系,取出了表中的一列作为数据.

你可能感兴趣的:(DB2数据库学习总结)