Oracle-11g

如何將特定欄位分成單獨的列?

  • August 7, 2013

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

引用自:https://dba.stackexchange.com/questions/47673