[英]Combining two SQL ORACLE Select Statements with JOIN and COUNT
我已經開發了兩個查詢,它們從數據庫中的單獨表中提取。 第一個查詢是:
SELECT VEHICLES.vehicleModel,
COUNT(*) SALES_BY_MODEL
FROM SALES
INNER JOIN VEHICLES ON SALES.vehicleVIN = VEHICLES.vehicleVIN
GROUP BY VEHICLES.vehicleModel
ORDER BY SALES_BY_MODEL DESC;
它的輸出看起來像這樣:
VEHICLEMODEL SALES_BY_MODEL
spark 9
accord 8
focus 6
xt5 5
rx 5
ranger 5
impala 5
第二個查詢是:
SELECT CUSTOMERS.customerZip,
COUNT(*) SALES_BY_ZIP
FROM SALES
INNER JOIN CUSTOMERS ON SALES.customerID = CUSTOMERS.customerID
GROUP BY CUSTOMERS.customerZip
ORDER BY SALES_BY_ZIP DESC;
它的輸出看起來像這樣:
CUSTOMERZIP SALES_BY_ZIP
89523 6
04019 4
85001 4
03038 4
13760 4
20886 3
我需要將這兩個查詢合並為一個SELECT語句。 我已經嘗試過了,但是關於COUNT函數我遇到了一些錯誤:
SELECT VEHICLES.vehicleModel, CUSTOMERS.customerZip,
COUNT(*) SALES_BY_MODEL, SALES_BY_ZIP
FROM SALES
INNER JOIN VEHICLES ON SALES.vehicleVIN = VEHICLES.vehicleVIN
INNER JOIN CUSTOMERS ON SALES.customerID = CUSTOMERS.customerID
GROUP BY VEHICLES.vehicleModel, CUSTOMERS.customerZip
ORDER BY SALES_BY_MODEL DESC, SALES_BY_ZIP DESC;
因此,我嘗試了一下,但是現在我的工作量大大減少了:
SELECT VEHICLES.vehicleModel, CUSTOMERS.customerZip,
(SELECT COUNT(*) AS SALES_BY_MODEL
FROM
(SELECT DISTINCT vehicleVIN FROM SALES
)
) AS SALES_BY_MODEL,
(SELECT COUNT(*) AS SALES_BY_ZIP
FROM
(SELECT DISTINCT customerZip FROM CUSTOMERS
)
) AS SALES_BY_ZIP
FROM SALES
INNER JOIN VEHICLES ON SALES.vehicleVin = VEHICLES.vehicleVIN
INNER JOIN CUSTOMERS ON SALES.customerID = CUSTOMERS.customerID
GROUP BY VEHICLES.vehicleModel, CUSTOMERS.customerZip;
輸出應類似於以下內容:
VEHICLEMODEL SALES_BY_MODEL
escalade 20
m3 15
spark 14
silverado 13
durango 12
accord 10
accent 9
sedan deville 2
CUSTOMERZIP SALES_BY_ZIP
60068 10
12550 9
48045 8
28115 7
將這兩個查詢合並為一個查詢的“適當”方法是什么,以便它們在單個表中顯示為輸出。 SALES_BY_MODEL和SALES_BY_ZIP列應降序排列,但SALES_BY_MODEL和SALES_BY_ZIP列不相互綁定,因此將它們保留在同一輸出表中不會產生負面影響。
謝謝!
您可以像上面提到的那樣獲得輸出,但是不會像預期結果中那樣獲得兩個表之間的列名。 一種解決方法是將類型設置為另一列。
SELECT * FROM
(SELECT "VEHICLEMODEL" TYPE,
VEHICLES.vehicleModel,
COUNT(*) COUNTS
FROM SALES
INNER JOIN VEHICLES ON SALES.vehicleVIN = VEHICLES.vehicleVIN
GROUP BY VEHICLES.vehicleModel
UNION
SELECT "CUSTOMERZIP" TYPE,
CUSTOMERS.customerZip,
COUNT(*)
FROM SALES
INNER JOIN CUSTOMERS ON SALES.customerID = CUSTOMERS.customerID
GROUP BY CUSTOMERS.customerZip
) CS
ORDER BY CS.TYPE DESC, CS.COUNTS DESC
最終弄清楚了這一點,並且效果很好。 感謝您的協助!
WITH
modelSales AS(
SELECT VEHICLES.vehicleModel, COUNT(*) AS salesByModel, ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) AS rankID
FROM SALES
INNER JOIN VEHICLES ON SALES.vehicleVIN = VEHICLES.vehicleVIN
GROUP BY VEHICLES.vehicleModel),
zipSales AS(
SELECT CUSTOMERS.customerZip, COUNT(*) AS salesByZip, ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) AS rankID
FROM SALES
INNER JOIN CUSTOMERS ON SALES.customerID= CUSTOMERS.customerID
GROUP BY CUSTOMERS.customerZip)
SELECT m.vehicleModel, m.salesByModel, z.customerZip, z.salesByZip
FROM modelSales m
FULL OUTER JOIN zipSales z ON m.rankID = z.rankID
ORDER BY COALESCE(m.rankID, z.rankID);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.