本人使用
oracle
時,遇到以下情況:需要輸出多列資料,但是這些資料卻分布在多行的同一列中。所以本人就想出了以下這種方式進行合併查詢。
示例是乙個
grades
表,記錄每個學生的姓名、課程和分數,分數都放在
grade
列中,現在要將各個科目的分數放到一行中顯示怎麼辦?
create table grades
( id number primary key,
name varchar2(10) not null,
course varchar2(10) not null,
grade number not null
);commit;
delete from grades;
commit;
insert into grades(id,name,course,grade) values(1,'周健','sx',78);
insert into grades(id,name,course,grade) values(2,'周健','yw',88);
insert into grades(id,name,course,grade) values(3,'周健','wl',42);
insert into grades(id,name,course,grade) values(4,'周健','hx',100);
insert into grades(id,name,course,grade) values(5,'張海威','sx',69);
insert into grades(id,name,course,grade) values(6,'張海威','yw',95);
insert into grades(id,name,course,grade) values(7,'張海威','wl',46);
insert into grades(id,name,course,grade) values(8,'張超','sx',31);
insert into grades(id,name,course,grade) values(9,'張超','yw',97);
insert into grades(id,name,course,grade) values(10,'張超','hx',89);
commit;
select
name 姓名,
nvl(sum(decode(course,'sx',grade))||'','未修') 數學,
nvl(sum(decode(course,'yw',grade))||'','未修') 語文,
nvl(sum(decode(course,'wl',grade))||'','未修') 物理,
nvl(sum(decode(course,'hx',grade))||'','未修') 化學
from grades
group by name;
其實,這個
sql語句的第一步是將每一行記錄進行擴充套件,使用
decode
函式將記錄分數的一列資料,擴充套件成為分別記錄各個科目分數的多列資料。第二步,使用
group by
對每個人進行分組,然後合併分組,得到資料。
select
name 姓名,
nvl(sum(sx)||'','未修') 數學,
nvl(sum(yw)||'','未修') 語文,
nvl(sum(wl)||'','未修') 物理,
nvl(sum(hx)||'','未修') 化學
from
( select
name,
decode(course,'sx',grade) sx,
decode(course,'yw',grade) yw,
decode(course,'wl',grade) wl,
decode(course,'hx',grade) hx
from grades
)group by name;
Oracle多行資料合併
1.多個未知數值合併 selectoperate id,max substr phone id,2 phone id from select operate id,sys connect by path phone id,phone id from select operate id,phone i...
MySQL 多行資料合併 GROUP CONCAT
表結構及資料 drop table if exists course create table course id int 11 not null,name varchar 50 default null comment 姓名 course name varchar 50 default null ...
MySQL 多行資料合併 GROUP CONCAT
表結構及資料 drop table if exists course create table course name varchar 255 character set utf8 collate utf8 general ci default null,course name varchar 25...