一、固定行列转换
1、Decode方式
SELECT ID,NAME, SUM(DECODE(course,'语文',score,0)) 语文,--这里使用max,min都可以 SUM(DECODE(course,'数学',score,0)) 数学, SUM(DECODE(course,'英语',score,0)) 英语, SUM(DECODE(course,'历史',score,0)) 历史, SUM(DECODE(course,'化学',score,0)) 化学 FROM kecheng GROUP BY ID ,NAME

2、Case方式
SELECT ID,NAME, MAX(CASE WHEN course='语文' THEN score ELSE 0 END) 语文, MAX(CASE WHEN course='数学' THEN score ELSE 0 END) 数学, MAX(CASE WHEN course='英语' THEN score ELSE 0 END) 英语, MAX(CASE WHEN course='历史' THEN score ELSE 0 END) 历史, MAX(CASE WHEN course='化学' THEN score ELSE 0 END) 化学 FROM kecheng GROUP BY ID ,NAME
结果与上方一样
3、wmsys.wm_concat行列转换函数
SELECT ID,NAME, wmsys.wm_concat(course || ':'||score) course FROM kecheng GROUP BY ID ,NAME;


4、使用over(partition by t.u_id)用法
SELECT NAME, wmsys.wm_concat(course ||score) OVER (PARTITION BY NAME) FROM kecheng

二、动态转换
1、使用PL/SQL
DECLARE
--存放最终的SQL
LV_SQL VARCHAR2(3000);
--存放连接的SQL
SQL_COMMOND VARCHAR2(3000);
--定义游标
CURSOR CUR IS
SELECT COURSE FROM KECHENG GROUP BY COURSE;
BEGIN
--定义查询开头
SQL_COMMOND := 'SELECT NAME ';
FOR I IN CUR LOOP
--将结果相连接
SQL_COMMOND := SQL_COMMOND || ' ,SUM(DECODE(course,''' || I.COURSE ||
''',score,0)) ' || I.COURSE;
DBMS_OUTPUT.PUT_LINE(SQL_COMMOND);
END LOOP;
SQL_COMMOND := SQL_COMMOND || ' from KECHENG group by name';
LV_SQL := 'INSERT INTO temp_ss ' || SQL_COMMOND;
DBMS_OUTPUT.PUT_LINE(LV_SQL);
EXECUTE IMMEDIATE LV_SQL;
END;
temp_ss 表
三、时间与字符串转换
1、时间转字符串
SELECT to_char(MAX(UPDATE_TIME), 'yyyy-mm-dd hh24:mi:ss') as lastUpdateTime,
to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') as accountTime
FROM QLK_AREA;
2、字符串转时间再转字符串
SELECT to_char(to_date(MAX(LASTUPDATETIME), 'yyyymmddhh24miss'),
'yyyy-mm-dd hh24:mi:ss') as lastUpdateTime,
to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') as accountTime
FROM PSN_MZ_LHDJXX_BL;
本文介绍在SQL中进行固定和动态行列转换的方法,包括使用Decode、Case语句、wmsys.wm_concat函数及over()语法,以及通过PL/SQL实现动态SQL生成。此外,还展示了时间与字符串的相互转换技巧。

2965

被折叠的 条评论
为什么被折叠?



