Oracle-11g
如何將特定欄位分成單獨的列?
Oracle 數據庫 11g 企業版 11.2.0.2.0 - 64 位生產。
我有以下格式的表格:
**沒有 | 使用者 | 價值** 01 | 港口 | 資金 01 | 貴賓1 | 系統 02 | 港口 | 銀行 02 | 貴賓1 | 權威
這就是我想要的:
**沒有 | 港口 | 貴賓1** 01 | 基金 | 系統 02 | 銀行 | 權威
現在的問題是,在這個表中,除了 Port 和 Vip1 之外,User 列還有 6 個其他條目。所以我想要 6 列和它們各自的值。我還想要一個可以在具有不同使用者列條目的其他類似表中使用的查詢。這就是我試圖做的沒有任何成功:
SELECT No, CASE user WHEN 'Port' THEN Value ELSE NULL END AS Port, CASE user WHEN 'Vip1' THEN Value ELSE NULL END AS Vip1 FROM table1
請讓我知道你在想什麼。
你非常親近。您忘記的是對每個透視列應用
GROUP BY
聚合函式(MIN()
或者MAX()
在這種情況下無關緊要)。話雖如此,您的查詢應該看起來像
SELECT No, MIN(CASE WHEN "User" = 'Port' THEN Value END) Port, MIN(CASE WHEN "User" = 'Vip1' THEN Value END) Vip1 FROM Table1 GROUP BY No
輸出:
| 否 | 港口 | 貴賓1 | -------------------------- | 1 | 基金 | 系統 | | 2 | 銀行 | 權威 |
這是**SQLFiddle**展示
如果給定的使用者名中沒有一個為空,則此查詢會為您提供所需的答案,包括“NULL”值。
SELECT t1.NO No, t1.VALUE AS PORT, t2.VALUE AS Vip1 FROM table1 t1 FULL OUTER JOIN table1 t2 ON t1.NO = t2.NO WHERE t1.USERNAME = 'Port' AND t2.USERNAME = 'Vip1';
在桌子上:
SQL> select * from table1 where username = 'Port'; NO USERNAME VALUE -- -------------------- ---------------------------------------- 01 Port Funds 02 Port Bank
我將“USER”列更改為“USERNAME”,因為“USER”是 oracle 中的保留字。
這給出了輸出(在 oracle 11g 中):
No PORT VIP1 ----------------- 01 Funds Systems 02 Bank Authority
實現此目的的另一種方法是使用 PIVOT 表。需要注意的是,PIVOT 表僅適用於聚合函式。例如,如果 No = 01 的“埠”有兩個不同的條目,則只會返回其中一個。
SELECT * FROM (SELECT No, Username, VALUE from table1) PIVOT (MAX(Value) FOR (Username) IN ('Vip1', 'Port')) ORDER BY No;
對此稍有變化,可為您提供未指定使用者名的數據透視表。不幸的是,oracle11g 只為此提供 XML 輸出。
SET LONG 10000 <-- to see the output on the terminal SELECT * FROM ( SELECT No, Username, VALUE FROM table1) PIVOT XML (MAX(Value) FOR (Username) IN (SELECT DISTINCT Username FROM table1));
有關 oracle 數據透視表的更多資訊,請參閱http://www.oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1.php