• SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子


    使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UNPIVOT,则可以很容易的实现行列转换的需求。

    在本文中我们将通过两个简单的例子详细讲解PIVOT和UNPIVOT的用法。

    PIVOT是行转列,用法如下: 
    假如表结构如下:
          id  name quarter  profile
          1     a        1         1000
          1     a        2         2000
          1     a        3         4000
          1     a        4         5000
          2     b        1         3000
          2     b        2         3500
          2     b        3         4200
          2     b        4         5500
      ----------------------------------------------
         使用PIVOT将四个季度的利润转换成横向显示:
           select id,name,
                 [1] as "一季度",[2] as "二季度",[3] as "三季度",[4] as "四季度"
                 from test
                 pivot
                 (
                   sum(profile)
                   for quarter in ([1],[2],[3],[4])
                 )
                 as pvt

     -----------------------------------------------
     得出的结果如下:
        id  name   一季度  二季度  三季度  四季度
        1     a         1000    2000     4000     5000
        2     b         3000    3500     4200     5500
                    

    ========================================================================================


    UNPIVOT是列转行,用法如下:
    假如表结构如下:
        id   name    Q1        Q2       Q3        Q4                   
        1      a       1000    2000    4000     5000
        2      b       3000    3500    4200     5500
     -----------------------------------------------
        使用UNPIVOT,将同一行中四个季度的列数据转换成四行数据:
           select id,name,quarter,profile
               from test
               unpivot
               (
                  profile
                  for quarter in ([Q1],[Q2],[Q3],[Q4])
               )
               as unpvt


     -----------------------------------------------
     得出的结果如下:
        id   name   quarter    profile
        1       a         Q1        1000
        1       a         Q2        2000
        1       a         Q3        4000
        1       a         Q4        5000
        2       b         Q1        3000
        2       b         Q2        3500
        2       b         Q3        4200
        2       b         Q4        5500

    ------------------------------------------------------------------------------

    ORACLE纵向表转换为横向表写法

    设存在如下纵向表,第一列为id(可能是某个业务数据的id),第二列为类型,第三列为类型对应的值,如下图:

    如上表,存在2,3,4三种类型,其中业务数据ID为1的三种类型都有值,业务数据ID为2的三种类型都有值,业务数据ID为3的只有类型2和3有值,现在要把纵向表横过来显示,可以采用如下代码:

    [sql] view plain copy
     
    1.  -- =========================================================  
    2. -- 纵向表变横向表:  
    3. -- 1. 转换类型,类型的值必须是整数,且不等于0,即0没有意义,0可以表示为空  
    4.  -- =========================================================  
    5. SELECT   
    6.        t.id,  
    7.        SUM(DECODE(t.code, 2, 2, 0)) "第二项", -- 如果该行类型为2则就是2,其它的都为0  
    8.        SUM(DECODE(t.code, 3, 3, 0)) "第三项",  
    9.        SUM(decode(t.code, 4, 4, 0)) "第四项"  
    10.  FROM ttt t WHERE t.id=1 GROUP BY t.id;  
    11.  -- =========================================================  
    12. -- 纵向表变横向表:  
    13. -- 1. 转换类型对应的数据,且数据需要是数值,且0没有意义,即0可以表示为空  
    14.  -- =========================================================  
    15.  SELECT   
    16.        t.id,  
    17.        SUM(DECODE(t.code, 2, t.val, 0)) "第二项", -- 如果该行类型为2则显示2类型对应的值DECODE,否则都显示0  
    18.        SUM(DECODE(t.code, 3, t.val, 0)) "第三项",  
    19.        SUM(DECODE(t.code, 4, t.val, 0)) "第四项"  
    20.  FROM ttt t GROUP BY t.id;  

    ----------------------------------------------------------------------------------------------------------------------------------------

    oracle合并列的函数wm_concat的使用详解

    oracle wm_concat(column)函数使我们经常会使用到的,下面就教您如何使用oracle wm_concat(column)函数实现字段合并,如果您对oracle wm_concat(column)函数使用方面感兴趣的话,不妨一看。
    shopping:
    -----------------------------------------
    u_id       goods            num
    ------------------------------------------
    1                苹果                2
    2                 梨子               5
    1                 西瓜               4
    3                 葡萄               1
    3                香蕉                1
    1               橘子                 3
    =======================
    想要的结果为:
    --------------------------------
    u_id          goods_sum
    ____________________
    1              苹果,西瓜,橘子
    2              梨子
    3              葡萄,香蕉
    ---------------------------------
    1.select u_id, wmsys.wm_concat(goods) goods_sum  2. 3.from shopping  4. 5.group by u_id  
    想要的结果2:
    --------------------------------
    u_id          goods_sum
    ____________________
    1              苹果(2斤),西瓜(4斤),橘子(3斤)
    2              梨子(5斤)
    3              葡萄(1斤),香蕉(1斤)
    ---------------------------------
    使用oracle wm_concat(column)函数实现:
    select u_id, wmsys.wm_concat(goods || '(' || num || '斤)' ) goods_sum  
    from shopping  
    group by u_id  
    mysql---group_concat

  • 相关阅读:
    Html5响应式设计与实现广场
    hdu 4911 Inversion
    LAN远程重启server安全方法
    华丽的网上突出代码组件CodeMirror
    Edit Distance -- LeetCode
    FPGA合成编码
    SenchaTouch2.3.1 正在使用listpaging以及pullrefresh插入 分页演示样品做
    【白云观导引头】一首诗
    初步boost之pool图书馆学习笔记
    分段的作用
  • 原文地址:https://www.cnblogs.com/wjwen/p/5957569.html
Copyright © 2020-2023  润新知