簡體   English   中英

將兩個SQL ORACLE Select語句與JOIN和COUNT組合

[英]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_MODELSALES_BY_ZIP列應降序排列,但SALES_BY_MODELSALES_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM