最近在論壇裡經常看到有朋友問這個問題,下面列舉兩個真實問答例子來說明 一下:
例一:表如下:
id no name course score
1 001 趙 語文 80
2 001 趙 數學 40
3 001 趙 英語 60
4 002 李 語文 50
5 002 李 數學 30
6 003 唐 語文 20
sql語句執行結果如下:
no name allcouse 總分
001 趙 語文,數學,英語 180
002 李 語文,數學 80
003 唐 語文 20
答:如果本例中的學科數量是有限的並且是已知的,則可以使用遍歷的方法,用乙個sql語句來實現:
select no,name,yw||xx||yy allcouse,"語文"+"數學"+"英語" 總分 from
(select no,name, case when 語文<>0 then '語文' end yw,case when 數學<>0 then ',數學' end xx,case when 英語<>0 then ',英語' end yy,
"語文","數學","英語" from
(select no,name ,nvl(sum("語文"),0) "語文",nvl(sum("數學"),0) "數學",nvl(sum("英語"),0) "英語"
from (select no,name,
case when course='語文' then nvl(sum(score),0) end "語文",
case when course='數學' then nvl(sum(score),0) end "數學",
case when course='英語' then nvl(sum(score),0) end "英語"
from lht_test
group by no,name,course) t
group by no,name) tt) ttt
例二:table1(id varchar2(10), name varchar2(10))
id name
1 aa
1 bb
1 cc
2 xx
3 yy
3 zz
...想得到乙個結果集如下:
id names
1 aa+bb+cc
2 xx
3 yy+zz
...答:
這種情況中,name的值是不可預知的,則只能通過儲存過程來返回乙個記錄集來實現:
先定義乙個記錄集的type,
create or replace type t_name as object
(id number(10),
name varchar2(20),
);create or replace type t_tab_names as table
of t_name;
create or replace procedure p_test (p_ttab_names out t_tab_names) as
i number;
flag number;
vtemp varchar2(100);
tname t_name;
begin
i:=0;
p_ttab_names:=new t_tab_names();
for v in (select id from table1 group by id) loop
i:=i+1;
flag:=0;
for vv in (select id,name from table1 where id=v.id) loop
if (flag=0) then
vtemp:=vv.name;
else
vtemp:=vtemp||'+'||vv.name;
end if;
flag:=1;
end loop;
tname.id:=v.id;
tname.name:=vtemp;
p_ttab_names.extend;
p_ttab_names(i):=tname;
end loop;
exception when others then
dbms_output.put_line(sqlerrm);
end p_test;
oracle 橫向列變為縱向列
很多業務需求儲存資料的時候都採取key value的形式,展示時則需要key1,key2,key3.展示 效果如下 sql語句如下 select round sum case when data item code backn52 then data item value else 0 end 2 ...
在Oracle中採用縱向和橫向結構表
在本文中,我將分析 關係 資料庫中組織資料的不同方式,在本文的例子中,我採用oracle進行闡述,但其他關聯式資料庫面臨同樣的問題,這些關聯式資料庫組織資料的方式既有優點也有缺點,將給以區分,據此讀者可判定適合他們的需要資料組織方式。採用何種資料組織方式,取決於業務需求和開發需要,各種儲存資料的方式...
oracle 將查詢結果縱向橫向顯示。
使用max decode 函式可以將將查詢結果縱向橫向顯示 例如 表 dict 編號 lxbh 型別名稱 lxmc 101 變壓器 102 斷路器 103 電磁是電壓互感器 104 電容式電壓互感器顯示變壓器 斷路器 電磁是電壓互感器 電容式電壓互感器101 102 103 104select ma...