Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行

数据库   发布日期:2025年06月29日   浏览次数:114
  1. 函数PIVOTUNPIVOT转置函数实现行转列、列转行,效果如下图所示:
  2. .PIVOT为行转列,从图示的左边到右边
  3. .UNPIVOT为列转行,从图示的右边到左边
  4. .左边为纵表,结构简单,易扩展
  5. .右边为横表,展示清晰,方便查询
  6. .很多时候业务表为纵表,但是统计分析需要的结果如右边的横表,这时候就需要用到转置函数了
  7. 示例图表:
  8. Pivot语法:
  9. SELECT ....
  10. FROM <table-expr>
  11. PIVOT
  12. (
  13. aggregate-function(<column>)
  14. FOR <pivot-column> IN (<value1>, <value2>,..., <valuen>)
  15. ) AS <alias>
  16. WHERE .....
  17. 注意:
  18. FOR <pivot-column>
  19. 这个是不支持表达式的,如果需要,请通过子查询或者视图先预处理。
  20. Pivot
  21. 例子1:先构造一个子查询,然后根据CHANNEL列进行转置,源表sales_view里面可能有很多列,不需要列先通过子查询过滤掉再进行转置。
  22. 另外转置后的列指定了别名,值是对amount_sold列的汇总。
  23. SELECT * FROM
  24. (SELECT product, channel, amount_sold
  25. FROM sales_view
  26. ) S PIVOT (SUM(amount_sold)
  27. FOR CHANNEL IN ( AS DIRECT_SALES, AS INTERNET_SALES,
  28. AS CATALOG_SALES, AS TELESALES))
  29. ORDER BY product;
  30. PRODUCT DIRECT­_SALES INTERNET_SALES CATALOG_SALES TELESALES
  31. ---------------------- ------------ -------------- ------------- ---------
  32. ...
  33. Internal 6X CD-ROM 229512.97 26249.55
  34. Internal 8X CD-ROM 286291.49 42809.44
  35. Keyboard Wrist Rest 200959.84 38695.36 1522.73
  36. ...
  37. 例子2:基于多列进行转置,下面例子是基于channelquarter两列进行转置
  38. SELECT *
  39. FROM
  40. (SELECT product, channel, quarter, quantity_sold
  41. FROM sales_view
  42. ) PIVOT (SUM(quantity_sold)
  43. FOR (channel, quarter) IN
  44. ((, '') AS CATALOG_Q2,
  45. (, '') AS INTERNET_Q1,
  46. (, '') AS INTERNET_Q4,
  47. (, '') AS PARTNERS_Q2,
  48. (, '') AS TELE_Q3
  49. )
  50. );
  51. PRODUCT CATALOG_Q2 INTERNET_Q1 INTERNET_Q4 PARTNERS_Q2 TELE_Q3
  52. ------- ---------- ----------- ----------- ----------- -------
  53. ...
  54. Bounce
  55. ...
  56. Smash Up Boxing
  57. ...
  58. Comic Book Heroes
  59. ...
  60. 例子3:对多列的值进行汇总计算,以下是基于channel例进行转置,然后对amount_soldquantity_sold两列进行合计运算
  61. SELECT *
  62. FROM
  63. (SELECT product, channel, amount_sold, quantity_sold
  64. FROM sales_view
  65. ) PIVOT (SUM(amount_sold) AS sums,
  66. SUM(quantity_sold) AS sumq
  67. FOR channel IN (, , , )
  68. )
  69. ORDER BY product;
  70. PRODUCT 5_SUMS 5_SUMQ 4_SUMS 4_SUMQ 2_SUMS 2_SUMQ 9_SUMS 9_SUMQ
  71. ------------- ------ ------ ------ ------ ------ ------ ------ ------
  72. O/S Doc Set English 142780.36 381397.99 6028.66
  73. O/S Doc Set French 55503.58 132000.77
  74. ...
  75. Unpivot
  76. unpivotpivot的相反操作,进行的是列转行
  77. 例子1:先看源表结构,for子句指定将(Q1_SUMQ, Q2_SUMQ, Q3_SUMQ, Q4_SUMQ)这4列转置为行,
  78. for子句之前的quantity_sold4列转置后的列名,
  79. decode还定义了每列转置为行后新标示列的值,这个等下看第2个例子可以看到,也可以在 in 子句后面加 as 指定别名。
  80. UNPIVOT INCLUDE NULLS 指定空值也进行转置,如果是EXCLUDE NULLS 将忽略空值。
  81. SELECT *
  82. FROM pivotedTable
  83. ORDER BY product;
  84. PRODUCT Q1_SUMQ Q1_SUMA Q2_SUMQ Q2_SUMA Q3_SUMQ Q3_SUMA Q4_SUMQ Q4_SUMA
  85. --------------- ------- ------- ------- -------- ------- -------- ------- ---------
  86. .44MB External 58301.33 49001.56 56974.3 55341.28
  87. 128MB Memory 110763.63 132123.12 170710.4 157736.6
  88. " LCD 1812786.94 1672389.06 1859987.66 1844008.11
  89. SELECT product, DECODE(quarter, 'Q1_SUMQ', 'Q1', 'Q2_SUMQ', 'Q2', 'Q3_SUMQ', 'Q3',
  90. 'Q4_SUMQ', 'Q4') AS quarter, quantity_sold
  91. FROM pivotedTable
  92. UNPIVOT INCLUDE NULLS
  93. (quantity_sold
  94. FOR quarter IN (Q1_SUMQ, Q2_SUMQ, Q3_SUMQ, Q4_SUMQ))
  95. ORDER BY product, quarter;
  96. PRODUCT QUARTER QUANTITY_SOLD
  97. ------- -- -------------
  98. .44MB External 3.5" Diskette Q1
  99. .44MB External 3.5" Diskette Q2
  100. .44MB External 3.5" Diskette Q3
  101. .44MB External 3.5" Diskette Q4
  102. 128MB Memory Card Q1
  103. 128MB Memory Card Q2
  104. 128MB Memory Card Q3
  105. 128MB Memory Card Q4
  106. ...
  107. 例子2:转置多列的情况
  108. SELECT product, quarter, quantity_sold, amount_sold
  109. FROM pivotedTable
  110. UNPIVOT INCLUDE NULLS
  111. (
  112. (quantity_sold, amount_sold)
  113. FOR quarter IN ((Q1_SUMQ, Q1_SUMA) AS 'Q1', (Q2_SUMQ, Q2_SUMA) AS 'Q2', (Q3_SUMQ, Q3_SUMA) AS 'Q3', (Q4_SUMQ, Q4_SUMA) AS 'Q4'))
  114. ORDER BY product, quarter;
  115. PRODUCT QU QUANTITY_SOLD AMOUNT_SOLD
  116. ----------------------------- -- ------------- ------------
  117. .44MB External 3.5" Diskette Q1 58301.33
  118. .44MB External 3.5" Diskette Q2 49001.56
  119. .44MB External 3.5" Diskette Q3 56974.3
  120. .44MB External 3.5" Diskette Q4 55341.28
  121. 128MB Memory Card Q1 110763.63
  122. 128MB Memory Card Q2 132123.12
  123. 128MB Memory Card Q3 170710.4
  124. 128MB Memory Card Q4 157736.6
  125. 总结,基本上按照语法套用即可,注意将源表非相关列先过滤掉,可是是子查询,也可以是视图。
  126. ---------------------
  127. 作者:Seandba
  128. 来源:CSDN
  129. 原文:https://blog.csdn.net/seandba/article/details/?utm_source=copy
  130. 版权声明:本文为博主原创文章,转载请附上博文链接!

 

以上就是Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行的详细内容,更多关于Oracle SQL函数pivot、unpivot转置函数实现行转列、列转行的资料请关注九品源码其它相关文章!