首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 多欄橫向輸出技巧:單列資料轉多欄顯示實戰

     編輯:Oracle 資料庫基礎

需求場景:垂直資料橫向展開

常見報表需求:將單欄垂直資料(如商品清單)轉換為多欄橫向顯示,提升閱讀體驗。例如將 22 筆商品資料每 3 筆一組,轉為 3 組 ID+NAME 欄位並排顯示。

範例資料準備

WITH TEST AS (
  SELECT 1 AS Id, '蘋果汁' AS NAME FROM Dual UNION ALL
  SELECT 2, '牛奶' FROM Dual UNION ALL
  SELECT 3, '蕃茄醬' FROM Dual UNION ALL
  SELECT 4, '鹽' FROM Dual UNION ALL
  SELECT 5, '麻油' FROM Dual UNION ALL
  SELECT 6, '醬油' FROM Dual UNION ALL
  SELECT 7, '海鮮粉' FROM Dual UNION ALL
  SELECT 8, '胡椒粉' FROM Dual UNION ALL
  SELECT 9, '雞' FROM Dual UNION ALL
  SELECT 10, '蟹' FROM Dual UNION ALL
  SELECT 11, '民眾奶酪' FROM Dual UNION ALL
  SELECT 12, '德國奶酪' FROM Dual UNION ALL
  SELECT 13, '龍蝦' FROM Dual UNION ALL
  SELECT 14, '沙茶' FROM Dual UNION ALL
  SELECT 15, '味精' FROM Dual UNION ALL
  SELECT 16, '餅乾' FROM Dual UNION ALL
  SELECT 17, '豬肉' FROM Dual UNION ALL
  SELECT 18, '墨魚' FROM Dual UNION ALL
  SELECT 19, '糖果' FROM Dual UNION ALL
  SELECT 20, '桂花糕' FROM Dual UNION ALL
  SELECT 21, '花生' FROM Dual UNION ALL
  SELECT 22, '糯米' FROM Dual
)

核心 SQL 解決方案

SELECT 
  MAX(DECODE(MOD(Id, 3), 1, Id)) Id1,
  MAX(DECODE(MOD(Id, 3), 1, NAME)) Name1,
  MAX(DECODE(MOD(Id, 3), 2, Id)) Id2,
  MAX(DECODE(MOD(Id, 3), 2, NAME)) Name2,
  MAX(DECODE(MOD(Id, 3), 0, Id)) Id3,
  MAX(DECODE(MOD(Id, 3), 0, NAME)) Name3
FROM Test
GROUP BY TRUNC((ROWNUM - 0.1) / 3)
ORDER BY Id1;

關鍵技術解析

  1. MOD(Id, 3) 分組邏輯:利用 ID 餘數 1、2、0 對應三組欄位
  2. DECODE 條件轉向:符合餘數條件顯示值,否則回傳 NULL
  3. MAX 聚合消除 NULL:每組僅有一個非 NULL 值,MAX 即可取得目標值
  4. TRUNC((ROWNUM-0.1)/3) 分頁分組:巧妙利用 ROWNUM 將連續 3 筆歸為同一組(-0.1 修正邊界)

輸出結果示例

ID1 NAME1     ID2 NAME2     ID3 NAME3
1   蘋果汁    2   牛奶      3   蕃茄醬
4   鹽        5   麻油      6   醬油
7   海鮮粉    8   胡椒粉    9   雞
10  蟹        11  民眾奶酪  12  德國奶酪
13  龍蝦      14  沙茶      15  味精
16  餅乾      17  豬肉      18  墨魚
19  糖果      20  桂花糕    21  花生
22  糯米      (null)      (null)

進階應用提示

  • 欄組數可調整:MOD(Id, N) 對應 N 組欄位
  • 適用於固定筆數分頁報表、名單多欄列印、儀表板卡片佈局
  • 大量資料建議搭配分析函數 ROW_NUMBER() OVER (ORDER BY Id) 替代 ROWNUM 提升穩定性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved