在資料庫開發中,有時需要將明細資料轉換為層級結構的報表格式。例如:原始資料包含「地址、類型、詳情」三欄,期望輸出時將相同地址的記錄合並,並在地址行留白類型與詳情,形成類似樹狀的顯示效果。
利用 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
);
此技巧適用於「主從報表」、「分組匯總」等需在 SQL 層面直接產出格式化結果的場合,減少應用層處理邏輯。