首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 進階技巧:使用 DISTINCT 與 UNION 實現複雜報表輸出

     編輯:程式設計綜合問答

問題背景

在資料庫開發中,有時需要將明細資料轉換為層級結構的報表格式。例如:原始資料包含「地址、類型、詳情」三欄,期望輸出時將相同地址的記錄合並,並在地址行留白類型與詳情,形成類似樹狀的顯示效果。

解決方案

利用 DISTINCT 去重、UNION 合併多個查詢結果集,並配合 NVL2 或 CASE 控制欄位顯示邏輯,即可在單條 SQL 中完成。以下以 Oracle 語法為例:

CREATE TABLE test (
    address VARCHAR2(20),
    type VARCHAR2(20),
    detail VARCHAR2(20)
);

-- 插入測試資料
INSERT INTO test VALUES ('上海', '閘北', 'A地');
INSERT INTO test VALUES ('上海', '寶山', 'A地');
-- ... 其餘資料略

-- 核心查詢
SELECT NVL2(type, '', address) AS address, type, detail
FROM (
    SELECT DISTINCT address, '' AS type, '' AS detail FROM test
    UNION
    SELECT address, type, NULL AS detail FROM test GROUP BY type, address
    UNION
    SELECT address, type, detail FROM test
    ORDER BY address, type DESC, detail DESC
);

關鍵點解析

  • 第一層 UNION:取得所有不重複的地址,作為分組標題行。
  • 第二層 UNION:按地址與類型分組,獲取每個類型的首行(詳情留空)。
  • 第三層 UNION:保留所有原始明細行。
  • 外層 ORDER BY:確保地址分組在一起,且標題行排在最前。
  • NVL2 函數:當 type 為空時顯示地址,否則留白,實現報表的縮排效果。

應用場景

此技巧適用於「主從報表」、「分組匯總」等需在 SQL 層面直接產出格式化結果的場合,減少應用層處理邏輯。

原始資料 執行後效果 結果圖示
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved