[英]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.