• [转]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);

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

    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子句中的一个表产生了关系,取出了表中的一列作为数据.
  • 相关阅读:
    TTreeView.OnCustomDrawItem
    xe Style
    delphi 加密 XOR
    ReportMachine 自定义代码 画细线
    XE 安装后C盘占用太大,C盘空间清理
    FireFox 书签 缓存 路径设置
    Android 照相
    Android手机与服务器(案例一) webservice
    win10/win7 笔记本 开启虚拟无线 批处理
    Delphi XE6打电话
  • 原文地址:https://www.cnblogs.com/Fskjb/p/1893923.html
Copyright © 2020-2023  润新知