oracle行转列、列转行总结

1.行转列

(1)decode实现

SELECT t_year,
MAX(DECODE(t_month,'1月',t_value)) AS 一月,'2月',t_value)) AS 二月,'3月',t_value)) AS 三月,'4月',t_value)) AS 四月
FROM a_testtable WHERE t_month IN('1月','4月')
GROUP BY t_year;

 (2)case when实现

SELECT t_year,
MAX(CASE t_month WHEN '1月' THEN t_value END) AS 一月,
MAX(CASE t_month WHEN '2月' THEN t_value END) AS 二月,
MAX(CASE t_month WHEN '3月' THEN t_value END) AS 三月,
MAX(CASE t_month WHEN '4月' THEN t_value END) AS 四月
FROM a_testtable WHERE t_month IN('1月','4月')
GROUP BY t_year;

 (3)pivot函数

SELECT * FROM a_testtable
PIVOT(SUM(t_value) FOR t_month IN('1月' AS 一月,'2月' AS 二月,'3月' AS 三月,'4月' AS 四月));

SELECT * FROM 
(SELECT t_year AS ye,t_month AS mon,t_value AS val FROM a_testtable) a 
PIVOT(SUM(val) FOR mon IN('1月' AS 一月,'4月' AS 四月));

 2列转行

准备表及数据

 (1)decode实现

SELECT t_year,
DECODE(lvl,1,2,3,4,'4月') AS t_month,one_m,two_m,tree_m,four_m) AS t_qty
FROM b_testtable,(SELECT LEVEL lvl FROM dual CONNECT BY LEVEL<=4)
ORDER BY t_year,t_month;

(2)case when实现

 SELECT t_year,
CASE lvl WHEN 1 THEN '1月' 
    WHEN 2 THEN '2月' 
    WHEN 3 THEN '3月' 
    WHEN 4 THEN '4月' 
END AS t_month,
CASE lvl WHEN 1 THEN one_m 
    WHEN 2 THEN two_m 
    WHEN 3 THEN tree_m 
    WHEN 4 THEN four_m 
END AS t_qty
FROM b_testtable,t_month;

(3)unpivot函数实现

SELECT * FROM b_testtable
UNPIVOT(t_qty FOR t_month IN(one_m AS '1月',two_m AS '2月',tree_m AS '3月',four_m AS '4月'))
ORDER BY t_year,t_month;

 

 

相关文章

文章浏览阅读773次,点赞6次,收藏9次。【代码】c# json字符...
文章浏览阅读8.7k次,点赞2次,收藏17次。此现象一般定位到远...
文章浏览阅读2.8k次。mysql脚本转化为oracle脚本_mysql建表语...
文章浏览阅读2.2k次。cx_Oracle报错:cx_Oracle DatabaseErr...
文章浏览阅读1.1k次,点赞38次,收藏35次。本文深入探讨了Or...
文章浏览阅读1.5k次。默认自动收集统计信息的时间为晚上10点...