將縱向數據列表轉化為橫向數據字段
2024-07-21 02:35:39
供稿:網友
1 前言
在實際編程過程中,往往會碰到比較變態的用戶需求。例如:用戶需要將不同行的數據,合并起來,顯示于字段中的某個列。
例如:第一生產線生產:A,B產品;第二生產線生產:C、D產品,在數據庫中的記錄應為:
生產線 產品
1 A
1 B
2 C
2 D
但是用戶希望我們在界面中顯示的結果為:
生產線 產品
1 A、B
2 C、D
由于FORM不象PB,可以在前臺支持交叉表;用戶又需求對該數據進行某種處理,所以不能放在REPORT中實現,因此實現此類用戶需求,就只能在后臺實現了。
實現該用戶需求,大部份程序員會選擇使用臨時表,手工插入數據,本文主要論述使用視圖實現該需求的方法。
當然,使用臨時表實現該需求和使用視圖實現該需求的執行效率對比,仁者見仁,智者見智,不在本文中研討。
2 實現思路
2.1 創建一個表類型,用于將相同生產線不同的產品作為參數進行傳遞
2.2 創建一個函數,將傳入的數據表類型參數,轉化為字符類型返回
2.3 創建一個視圖,將縱向的數據轉化為橫向的數據,以字符方式顯示
3 實例演練
--3.1 創建測試環境
--創建數據表類型
Create Or Replace Type Tp_TempTable Is Table Of Varchar2(200);
/
--創建函數,將傳入的數據列表轉為橫向字符
Create Or Replace Function FN_GetLinePRod
(P_LineProd In TP_TempTable)
Return Varchar2
Is
L_Str varchar2(4000);
i Number;
Begin
For i in 1..P_LineProd.Count Loop
If L_Str Is Null Then
L_Str:=P_LineProd(i);
Else
L_Str := L_Str '、' P_LineProd(i);
End If;
end loop;
Return L_Str;
End FN_GetLineProd;
/
--創建過渡表
Drop Table T;
create table T (Line number,Prod varchar2(10));
insert into T values(1,'A');
insert into T values(1,'B');
insert into T values(1,'C');
insert into T values(2,'D');
insert into T values(2,'E');
Commit;
--3.2 執行查詢
--查詢語句
select
T0.Line --生產線編號
,FN_GetLineProd( --將同一生產線,不同產品的數據列表作為參數傳入自定義函數
Cast( --將嵌套表類型轉化為數據表類型
Multiset(Select Prod From T Where T.Line = T0.Line) --將與最外層查詢相同的生產線產品列表,以嵌套表方式返回
as TP_TempTable)
) Prod
From
(Select Distinct Line From T) T0 --得到生產線列表
;