oracle sql小結(主要講橫列轉換的例子)decode 以及case
--建表
create table kecheng
(
id NUMBER,
name VARCHAR2(20),
course VARCHAR2(20),
score NUMBER
);
--插入資料
insert into kecheng (id, name, course, score)
values (1, '張三', '語文', 67);
insert into kecheng (id, name, course, score)
values (1, '張三', '數學', 76);
insert into kecheng (id, name, course, score)
values (1, '張三', '英語', 43);
insert into kecheng (id, name, course, score)
values (1, '張三', '歷史', 56);
insert into kecheng (id, name, course, score)
values (1, '張三', '化學', 11);
insert into kecheng (id, name, course, score)
values (2, '李四', '語文', 54);
insert into kecheng (id, name, course, score)
values (2, '李四', '數學', 81);
insert into kecheng (id, name, course, score)
values (2, '李四', '英語', 64);
insert into kecheng (id, name, course, score)
values (2, '李四', '歷史', 93);
insert into kecheng (id, name, course, score)
values (2, '李四', '化學', 27);
insert into kecheng (id, name, course, score)
values (3, '王五', '語文', 24);
insert into kecheng (id, name, course, score)
values (3, '王五', '數學', 25);
insert into kecheng (id, name, course, score)
values (3, '王五', '英語', 8);
insert into kecheng (id, name, course, score)
values (3, '王五', '歷史', 45);
insert into kecheng (id, name, course, score)
values (3, '王五', '化學', 1);
commit;
select * from KECHENG t;
--2.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)) 化學,
sum(decode(course,'地理',score,0)) 地理,
sum(score) 總分
FROM kecheng
GROUP BY ID ,NAME
--2.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) 化學,
max(case when course='' then score else 0 end ) 無課 ,
sum(score) 總分
FROM kecheng
GROUP BY ID ,NAME
--結果與上方一樣
--2.3、wmsys.wm_concat行列轉換函式
SELECT ID,NAME,
wmsys.wm_concat(course || ':'||score) course
FROM kecheng
GROUP BY ID ,NAME;
--2.4、使用over(partition by t.u_id)用法
SELECT NAME, max(r) from (
SELECT name,wmsys.wm_concat(course ||score) OVER (PARTITION BY NAME order by course) r
FROM kecheng
) group by name