關於oracle中縱向記錄橫向顯示的問題舉例說明

2021-04-13 09:38:35 字數 2453 閱讀 5471

最近在論壇裡經常看到有朋友問這個問題,下面列舉兩個真實問答例子來說明 一下:

例一:表如下:

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...