繁体   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