如何在 Oracle 中 PIVOT 結果?


問題

你希望在 Oracle 中 PIVOT 結果。

解決方案

PIVOT 子句是 Oracle Database 11g 的一項新功能,它能夠讓你將查詢結果中的行翻轉為列,並同時允許你在資料上執行一個聚合函式。

PIVOT 對於檢視大量資料中的整體趨勢特別有用。

我們將使用銷售資料來演示用法。

示例

SELECT * FROM sales;

輸出

12008   12  1998-02-28  6   37  552 1898.88
12008   18  1998-02-28  6   37  463 1592.72
12008   20  1998-02-28  6   37  2430    8359.2
12008   25  1998-03-31  6   36  3387    12091.59
12008   26  1998-01-31  6   37  2381    8190.64

PIVOT 的語法。

示例

SELECT * FROM (   inner_query ) PIVOT (   aggregate_function FOR pivot_column IN (list_of_values) ) ORDER BY…;

我們將使用 PIVOT 來檢視一段時間內不同型別產品在銷售中的趨勢。以下是類似的示例。

示例

SELECT * FROM   (SELECT SUBSTR(time_id,06,02) AS month_val,     prod_id,     amount_sold   FROM sales   WHERE SUBSTR(time_id,01,04)           = 1998   ) PIVOT ( SUM(amount_sold) FOR prod_id IN (12008 , 12010 , 12011 ) ) ORDER BY month_val;

輸出

01  145714.96   1039519.04  1719280.2 02  149309.76   1067082.24  1758706.44 03  1072859.97  8045916.84  13191209.28 04  154280.56   1106052.23  1826847.36 05  155322.88   1119728.52  1848467.64 06  1166464.25  8477308.28  13882822.54 07  157737.76   1145882.33  1891410.4 08  167073.92   1214760.69  2010620.5 09  1274290.22  8932017.99  15038327.33 10  160988.56   1180869.5   1956298.5 11  159736.4    1189188     1964635.2 12  1227572.64  8795186.2   14774142.24

 我們還可以將多個表新增到 PIVOT 中。這裡有一個示例。

示例

SELECT * FROM   (SELECT SUBSTR(time_id,06,02) AS month_val,     prod_id,     amount_sold   FROM sales   WHERE SUBSTR(time_id,01,04) = 1998   ) PIVOT ( SUM(amount_sold) FOR (month_val, prod_id) IN ((01,12008), (02, 12010) ,(03, 12011 ) ));

此外,我們還可以在 PIVOT 查詢中使用多個聚合函式。

示例

SELECT * FROM   (SELECT SUBSTR(time_id,06,02) AS month_val,     prod_id,     amount_sold   FROM sales   WHERE SUBSTR(time_id,01,04)= 1998   ) PIVOT ( SUM(amount_sold),AVG(amount_sold) AS avg_amount FOR (month_val, prod_id) IN ((01,12008), (02, 12010) ,(03, 12011 ) ));

針對以上問題陳述的表結構:

示例

  CREATE TABLE "SALES"    (    "PROD_ID" NUMBER NOT NULL ENABLE,     "CUST_ID" NUMBER NOT NULL ENABLE,     "TIME_ID" VARCHAR2(20) NOT NULL ENABLE,     "CHANNEL_ID" NUMBER NOT NULL ENABLE,     "PROMO_ID" NUMBER NOT NULL ENABLE,     "QUANTITY_SOLD" NUMBER(10,2) NOT NULL ENABLE,     "AMOUNT_SOLD" NUMBER(10,2) NOT NULL ENABLE    ) ;

更新日期: 2020 年 12 月 5 日

1.4 萬多次檢視

開啟您的 職業生涯

完成課程,獲得認證

開始
廣告