Oracle 行專列是一種十分實用的技巧,可以將多行數(shù)據(jù)合并成為一行,每個數(shù)據(jù)以列的形式呈現(xiàn)。它在數(shù)據(jù)倉庫、數(shù)據(jù)分析等領域廣泛應用。下面我們來看一些例子。
假設我們有這樣一張表orders
:
order_id | product_name | quantity | price --------- | ------------ | -------- | ----- 1 | apple | 2 | 1.5 1 | orange | 3 | 2.0 2 | banana | 1 | 1.2 2 | grape | 5 | 3.0
我們希望將每個訂單的商品信息合并為一條記錄,可以使用以下 SQL 代碼:
SELECT order_id, LISTAGG(product_name, ',') WITHIN GROUP (ORDER BY product_name) AS products, SUM(quantity) AS total_quantity, SUM(quantity * price) AS total_price FROM orders GROUP BY order_id;
這里使用了 Oracle 內(nèi)置的LISTAGG
函數(shù),它可以將多個字符串拼接為一個字符串,并使用指定的分隔符連接。同時,我們也使用了分組聚合函數(shù)SUM
計算數(shù)量和價格的總和。
執(zhí)行上述 SQL 語句后,輸出的結(jié)果如下:
order_id | products | total_quantity | total_price --------- | ----------------- | -------------- | ----------- 1 | apple,orange | 5 | 7.5 2 | banana,grape | 6 | 19.2
可以看到,每個訂單的商品信息都被合并為一條記錄,前三列為訂單編號、商品名稱以及數(shù)量總和,最后一列為價格總和。
Oracle 行專列也可以用于交叉表查詢,將行數(shù)據(jù)轉(zhuǎn)置為列數(shù)據(jù)。例如,我們有以下表格sales
:
date | product_name | amount --------- | ------------ | ------ 2022-01-01 | apple | 100 2022-01-01 | banana | 200 2022-01-01 | grape | 300 2022-01-02 | apple | 50 2022-01-02 | orange | 150 2022-01-02 | grape | 250
現(xiàn)在我們希望將每個日期的銷售額按照商品名稱轉(zhuǎn)置為列數(shù)據(jù),我們可以使用以下 SQL 語句:
SELECT date, SUM(CASE WHEN product_name = 'apple' THEN amount ELSE 0 END) AS apple, SUM(CASE WHEN product_name = 'banana' THEN amount ELSE 0 END) AS banana, SUM(CASE WHEN product_name = 'grape' THEN amount ELSE 0 END) AS grape, SUM(CASE WHEN product_name = 'orange' THEN amount ELSE 0 END) AS orange FROM sales GROUP BY date;
這里使用了多個CASE
語句,根據(jù)商品名稱計算對應的銷售額,最后將它們放在一起得到每個日期的銷售額。
執(zhí)行上述 SQL 語句后,輸出的結(jié)果如下:
date | apple | banana | grape | orange --------- | ----- | ------ | ----- | ------ 2022-01-01 | 100 | 200 | 300 | 0 2022-01-02 | 50 | 0 | 250 | 150
可以看到,每個日期的銷售額都按照商品名稱轉(zhuǎn)置為了列數(shù)據(jù)。
總之,Oracle 行專列是一種非常實用的技巧,可以幫助我們將多行數(shù)據(jù)合并為一行或?qū)⑿袛?shù)據(jù)轉(zhuǎn)置為列數(shù)據(jù),更方便地進行數(shù)據(jù)處理和分析。