豎錶轉橫表(ORACLE)
豎錶轉橫表(ORACLE)一般形式為將一個列為C!, C2, … CN的表,以C1, C2, … CX為基準,將CX+1, … CN的不同值改為列。一般化的語法:
SELECT C1, C2, … CX,..... 另外,如果無基準的情況 比如.....見下文[@more@]
一般形式為將一個列為C!, C2, … CN的表,以C1, C2, … CX為基準,將CX+1, … CN的不同值改為列。一般化的語法:
SELECT C1, C2, … CX,
MAX(DECODE(rn, 1, CX+1, NULL)) CX+1_1, … MAX(DECODE(rn, 1, CN, NULL))
CN_1
MAX(DECODE(rn, 2, CX+1, NULL)) CX+1_2, … MAX(DECODE(rn, 2, CN, NULL))
CN_2
…
MAX(DECODE(rn,N,CX+1, NULL)) CX+1_N, … MAX(DECODE(rn,N, CN, NULL))
CN_N
FROM
(SELECT C1, C2, …
CN,
ROW_NUMBER() OVER (PARTITION
BY C1, C2, … CX ORDER BY
FROM T
WHERE …)
GROUP BY C1, C2, … CX;
通用包:
CREATE OR REPLACE PACKAGE
pkg_pivot
AS
TYPE refcursor IS REF CURSOR;
TYPE ARRAY IS TABLE OF VARCHAR2(30);
PROCEDURE pivot(p_max_cols IN NUMBER DEFAULT
NULL,
p_max_cols_query IN VARCHAR2
DEFAULT NULL,
p_query IN
VARCHAR2,
p_anchor IN
ARRAY,
p_pivot IN
ARRAY,
p_cursor IN OUT
refcursor);
END;
CREATE OR REPLACE PACKAGE BODY
pkg_pivot
AS
PROCEDURE pivot(p_max_cols IN NUMBER DEFAULT
NULL,
p_max_cols_query IN VARCHAR2
DEFAULT NULL,
p_query IN
VARCHAR2,
p_anchor IN
ARRAY,
p_pivot IN
ARRAY,
p_cursor IN OUT
refcursor)
AS
l_max_cols NUMBER;
l_query LONG;
l_cnames ARRAY;
BEGIN
IF (p_max_cols IS NOT NULL)
THEN
EXECUTE IMMEDIATE p_max_cols_query INTO
l_max_cols;
ELSE
RAISE_APPLICATION_ERROR(-20001, 'Cannot
figure out max cols');
END IF;
l_query := 'select ';
FOR i IN 1 .. p_anchor.count
LOOP
l_query := l_query || p_anchor(i) ||
',';
END LOOP;
FOR i IN 1 .. l_max_cols
LOOP
FOR j IN 1 ..
p_pivot.count
LOOP
l_query := l_query ||
'max(decode(rn,'||i||','||p_pivot(j)||',null)) '||p_pivot(j) || '_' || i ||
',';
END LOOP;
END LOOP;
l_query := RTRIM(l_query,',') || ' from (' || p_query || ') group by
';
FOR i IN 1 .. p_anchor.count
LOOP
l_query := l_query || p_anchor(i) ||
',';
END LOOP;
l_query := RTRIM(l_query,',');
EXECUTE IMMEDIATE 'alter session set
cursor_sharing=force';
OPEN p_cursor FOR l_query;
EXECUTE IMMEDIATE 'alter session set
cursor_sharing=exact';
END;
END;
其中:
p_max_cols_query為SELECT MAX(COUNT(*)) FROM TABLE_NAME GROUP BY C1, C2, …
CX;
p_query為SELECT C1, C2, … CN ROW_NUMBER() OVER (PARTITION BY C1, C2, … CX
ORDER BY
p_anchor為pkg_pivot.array(C1, C2, … CX)
p_pivot為pkg_pivot.array(CX+1, CX+2, … CN)
p_cursor為返回的遊標。
另外,如果無基準的情況 比如
表結構與資訊如下:
CREATE TABLE TB_ITEM_INFO(
item_name varchar2(20),
item_data number(10,4),
constraint PK_ITEM_INFO primary key (item_name)
);
item_name(primary_key) item_data
value1 1.0
value2 2.0
value3 3.0
欲轉為:
value1 value2 value3
1.0 2.0 3.0
則轉化函式為:
SELECT SUM(decode(item_name, 'value1', item_data, 0)) value1, SUM(decode(item_name, 'value2', item_data, 0)) value2, SUM(decode(item_name, 'value3', item_data, 0)) value3 FROM TB_ITEM_INFO;
(即 把group by 語句去掉即可)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8780503/viewspace-1033007/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 豎錶轉橫表(SQL SERVER)SQLServer
- oracle 豎表,橫表(a stupid way,want the smart way)Oracle
- perl橫豎轉換
- iOS 橫豎屏旋轉總結iOS
- iOS橫豎屏iOS
- activity橫屏豎屏
- Swift橫豎屏切換、自動旋轉螢幕、手動旋轉螢幕、鎖定當前螢幕禁止轉屏、橫豎屏頁面跳轉過度、橫豎屏UI適配SwiftUI
- 程式碼處理 iOS 的橫豎屏旋轉iOS
- iOS 橫豎屏切換iOS
- Android橫豎屏切換Android
- Oracle線上將普通錶轉分割槽表Oracle
- Oracle 將普通錶轉換為分割槽表Oracle
- App中橫豎屏的設定APP
- 檢測橫屏豎屏程式碼
- ORACLE普通錶轉換成分割槽表的操作Oracle
- ORACLE將普通錶轉變為分割槽表方法Oracle
- Activity橫豎屏切換生命週期
- js監聽手機橫豎屏事件JS事件
- android-Fragment橫豎屏翻轉對重新載入的要求AndroidFragment
- ORACLE 普通錶轉換成分割槽表(線上重定義)Oracle
- oracle表對錶的多行更新Oracle
- [iOS]終極橫豎屏切換解決方案iOS
- unity 動態修改當前橫豎屏狀態Unity
- 匹配橫屏或者豎屏css程式碼例項CSS
- 40 橫豎屏切換略縮圖不能定位
- ORACLE 普通錶轉換成分割槽表(線上重定義)(zt)Oracle
- Win10如何將音量條從橫向變為豎向 win10音量條怎麼從橫向變為豎向Win10
- ORACLE複製舊錶到新表Oracle
- Android 橫豎屏處理的知識小結Android
- 橫屏和豎屏切換介面不重新整理
- 堆錶轉換成分割槽表
- 普通錶轉換為分割槽表
- T113啟動G2D旋轉豎屏當作橫屏使用
- ORACLE 11g 範圍分割槽錶轉換INTERVAL分割槽表Oracle
- Oracle Database將普通錶轉換為分割槽表遇到的問題OracleDatabase
- Android 拍攝(橫 豎屏)視訊的懶人之路Android
- 直播電商平臺開發,橫豎屏切換的方法
- 直播系統搭建,判斷螢幕橫豎屏狀態