如何合并两个SQL查询?获取客户单产品订购量及产品总订购量
合并查询实现客户订购量与产品总订购次数同屏展示
没问题,你可以通过两种常用方式实现这个需求,我给你详细说明:
方法一:使用窗口函数(推荐,更简洁高效)
窗口函数可以在不额外关联表的情况下,直接计算每个产品的总订购次数,和客户的订购数放在同一结果集中:
SELECT C.CustomerID, P.ProductName, COUNT(*) AS CustomerOrdered, -- 单个客户对该产品的订购次数 COUNT(*) OVER (PARTITION BY P.ProductName) AS TotalOrdered -- 该产品的总订购次数 FROM Customers AS C JOIN Orders AS O ON C.CustomerID = O.CustomerID JOIN [Order Details] AS OD ON O.OrderID = OD.OrderID JOIN Products AS P ON OD.ProductID = P.ProductID GROUP BY C.CustomerID, P.ProductName
说明
COUNT(*) OVER (PARTITION BY P.ProductName) 这个窗口函数会按照产品名称分组,计算每个产品在所有订单中的总订购次数,直接嵌入到你的第一个查询里,不需要额外的表关联,执行效率更高。
方法二:使用子查询关联
如果你更习惯用子查询的方式,也可以把你原来的两个查询分别作为子查询,通过产品名称关联起来:
SELECT CustProd.CustomerID, CustProd.ProductName, CustProd.Ordered AS CustomerOrdered, -- 单个客户的订购次数 TotalProd.Ordered AS TotalOrdered -- 产品总订购次数 FROM ( -- 子查询1:获取每个客户对各产品的订购次数 SELECT C.CustomerID, P.ProductName, COUNT(*) AS Ordered FROM Customers AS C JOIN Orders AS O ON C.CustomerID = O.CustomerID JOIN [Order Details] AS OD ON O.OrderID = OD.OrderID JOIN Products AS P ON OD.ProductID = P.ProductID GROUP BY C.CustomerID, P.ProductName ) AS CustProd JOIN ( -- 子查询2:获取每个产品的总订购次数 SELECT P.ProductName, COUNT(*) AS Ordered FROM Products AS P JOIN [Order Details] AS OD ON P.ProductID = OD.ProductID GROUP BY P.ProductName ) AS TotalProd ON CustProd.ProductName = TotalProd.ProductName
说明
这个方法就是把你已经写好的两个查询封装成子查询,然后通过ProductName字段关联,将两个结果集的对应数据合并到同一行。
内容的提问来源于stack exchange,提问作者user4940368
相关产品推荐
相关产品推荐

