一次偶然的機會,使用到了萬年不用的交叉連接(CROSS JOIN)
業務場景如下:
1、存在多個運營商,每個運營商下面都有各種類型的設備,不同運營商的設備不完全相同;
2、任何設備有且僅有兩種用途‘訂購’、‘置換’
3、現在要統計發生了‘訂購’、‘置換’操作運營商的訂購數和置換數
思路:
先用交叉連接把所有存在訂購和置換的運營商和設備組合查詢出來(這里把運營商表和設備表交叉連接起來也是一樣)
再過濾掉無數據的組合
各運營商各設備的訂購數如圖
各運營商各設備的置換數如圖
統計結果如下
SQL如下(可直接運行)
WITH a AS(
SELECT 'o1' 運營商,'s1' 設備,'10' 訂購數 FROM dual
UNION ALL
SELECT 'o1', 's2', '15' FROM dual
UNION ALL
SELECT 'o1', 's3', '20' FROM dual
UNION ALL
SELECT 'o2', 's1', '30' FROM dual
UNION ALL
SELECT 'o2', 's2', '35' FROM dual
),
b AS(
SELECT 'o1' 運營商,'s1' 設備,'10' 置換數 FROM dual
UNION ALL
SELECT 'o1', 's2', '15' FROM dual
UNION ALL
SELECT 'o2', 's4', '20' FROM dual
UNION ALL
SELECT 'o2', 's1', '30' FROM dual
UNION ALL
SELECT 'o4', 's2', '35' FROM dual
),
op AS(
SELECT a.運營商 FROM a
UNION
SELECT b.運營商 FROM b
),
sb AS(
SELECT a.設備 FROM a
UNION
SELECT b.設備 FROM b
),
opsb AS(
SELECT DISTINCT op.運營商,sb.設備 FROM op
CROSS JOIN sb)
SELECT opsb.運營商,opsb.設備,NVL(a.訂購數,0) 訂購數,NVL(b.置換數,0) 置換數
FROM opsb
LEFT JOIN a ON a.運營商 = opsb.運營商 AND a.設備 = opsb.設備
LEFT JOIN b ON b.運營商 = opsb.運營商 AND b.設備 = opsb.設備
WHERE 訂購數 IS NOT NULL
OR 置換數 IS NOT NULL
?