sql 查询结果多行数据转换一行展示(Oracle)
问题简述:
如上图所示,sql
语句执行结果,column_nm2、column_nm5、column_nm7
有多种分类码值(001、002、003
),并且每种分类码值都单独占据一行,导致相同字段有很多行,这不是我想要的查询结果,我希望查询结果中字段的 所有分类码值按照顺序都展示在同一行
;
解决方案:
先利用 ROW_NUMBER() OVER(PARTITION BY...ORDER BY...) AS RN
实现数据的分组排序编号,再结合 MAX函数
和 CASE WHEN
实现将纵向的分类码值数据(多行)转换为横向展示。
SELECT
字段编码,
字段名称,
MAX(CASE WHEN RN = 1 THEN A END) AS 分类码值1,
MAX(CASE WHEN RN = 1 THEN B END) AS 码值1编码,
MAX(CASE WHEN RN = 1 THEN C END) AS 码值1名称,
MAX(CASE WHEN RN = 1 THEN D END) AS 码值1是否启用,
MAX(CASE WHEN RN = 2 THEN A END) AS 分类码值2,
MAX(CASE WHEN RN = 2 THEN B END) AS 码值2编码,
MAX(CASE WHEN RN = 2 THEN C END) AS 码值2名称,
MAX(CASE WHEN RN = 2 THEN D END) AS 码值2是否启用,
MAX(CASE WHEN RN = 3 THEN A END) AS 分类码值3,
MAX(CASE WHEN RN = 3 THEN B END) AS 码值3编码,
MAX(CASE WHEN RN = 3 THEN C END) AS 码值3名称,
MAX(CASE WHEN RN = 3 THEN D END) AS 码值3是否启用
FROM (
SELECT
T1.字段编码,
T1.字段名称,
T2.分类码值序列 A,
T2.分类码值编码 B,
T2.分类码值名称 C,
T2.分类码值是否启用 D,
ROW_NUMBER() OVER(PARTITION BY T1.字段编码 ORDER BY T2.分类码值序列) AS RN
FROM TABLE1 T1, TABLE2 T2
WHERE T1.ID = T2.ID
) t
GROUP BY 字段编码, 字段名称
ORDER BY 字段编码;
注意:
上述只是示例,请结合自己的实际问题来处理,请勿照本宣科,目的是告诉大家解决此类问题时,了解 ROW_NUMBER() OVER(PARTITION BY...ORDER BY...) AS RN
、MAX函数
、CASE WHEN
的用法。