Sql 寻找最受欢迎的产品
我正试图写一个查询,根据他们购买的所有产品的数量,将前5名客户拉出来。没问题。但除此之外,我需要找到这5位客户中最受欢迎的产品 我想我可以通过查看他们购买最多的产品来做到这一点(因此productID的数量是最大数量),但我不太确定如何获得productID。有什么想法吗?我这样做完全错了吗?谢谢Sql 寻找最受欢迎的产品,sql,sql-server,Sql,Sql Server,我正试图写一个查询,根据他们购买的所有产品的数量,将前5名客户拉出来。没问题。但除此之外,我需要找到这5位客户中最受欢迎的产品 我想我可以通过查看他们购买最多的产品来做到这一点(因此productID的数量是最大数量),但我不太确定如何获得productID。有什么想法吗?我这样做完全错了吗?谢谢 select top 5 c.CustomerID, sum(sod.orderqty) AS 'Amount Purchased', max(sod.orderqty) AS 'Most Purc
select top 5 c.CustomerID, sum(sod.orderqty) AS 'Amount Purchased',
max(sod.orderqty) AS 'Most Purchased'
from Sales.Customer c
inner join Sales.SalesOrderHeader soh on soh.CustomerID = c.CustomerID
inner join Sales.SalesOrderDetail sod on sod.SalesOrderID = soh.SalesOrderID
inner join Production.Product p on p.ProductID = sod.ProductID
group by c.CustomerID
order by 'Amount Purchased' desc
我尝试了下面的查询,但出于某种原因,将p.name包含在group by中完全偏离了最大值。例如,在这个查询中,“最常购买”应该是20,但它显示为18(第二个最大值)
按产品进行中间聚合:
select top 5 CustomerId, sum(AmountPurchased) as AmountPurchased,
max(AmountPurchased) as maxAmountPurchased,
max(case when seqnum = 1 then productId end) as MostPurchased
from (select c.CustomerID, p.ProductId, sum(sod.orderqty) AS AmountPurchased,
row_number() over (partition by c.CustomerId order by sum(sod.orderqty) desc) as seqnum
from Sales.Customer c inner join
Sales.SalesOrderHeader soh
on soh.CustomerID = c.CustomerID inner join
Sales.SalesOrderDetail sod
on sod.SalesOrderID = soh.SalesOrderID inner join
Production.Product p
on p.ProductID = sod.ProductID
group by c.CustomerID, ProductId
) cp
group by CustomerId
order by AmountPurchased desc;
请注意,这与您查询的最大金额略有不同。此版本提供了总产品级别的最大值。您可以在子查询中使用
max()
来获取您的版本,但这似乎是您真正想要的。我们可以分两个阶段来完成。我正在使用SQLServer2008
首先,像您一样查找前5名客户:
WITH
CTE_TopCustomers
AS
(
select top (5)
c.CustomerID
, sum(sod.orderqty) AS 'Amount Purchased'
from
Sales.Customer c
inner join Sales.SalesOrderHeader soh on soh.CustomerID = c.CustomerID
inner join Sales.SalesOrderDetail sod on sod.SalesOrderID = soh.SalesOrderID
inner join Production.Product p on p.ProductID = sod.ProductID
group by
c.CustomerID
order by 'Amount Purchased' desc
)
然后为每一位客户找到最受欢迎的产品。请参见交叉应用
中的子查询。这里的“最受欢迎”指的是顾客总共购买最多的产品。比如说,如果客户在一天内购买了10台ID=1的产品,在第二天购买了20台ID=1的相同产品,那么总数将是30台。如果同一客户在一天内购买了25件ID=2的其他产品,那么该客户最受欢迎的产品将是ID=1的产品,总共30件
如果您想选择ID=2
的产品作为本例中最受欢迎的产品,请在交叉应用
中将总和
更改为MAX
SELECT
CTE_TopCustomers.CustomerID
,CTE_TopCustomers.[Amount Purchased]
,CTE_Products.ProductID
,CTE_Products.ProductName
,CTE_Products.SumCustomerProductQty
FROM
CTE_TopCustomers
CROSS APPLY
(
SELECT TOP (1)
p.ProductID
,p.name AS ProductName
,SUM(sod.orderqty) AS SumCustomerProductQty
FROM
Sales.SalesOrderHeader soh on soh.CustomerID = CTE_TopCustomers.CustomerID
inner join Sales.SalesOrderDetail sod on sod.SalesOrderID = soh.SalesOrderID
inner join Production.Product p on p.ProductID = sod.ProductID
GROUP BY
p.ProductID
,p.name
ORDER BY SumCustomerProductQty DESC
) AS CTE_Products
ORDER BY [Amount Purchased] DESC;
对于最后一个查询,只需将两个代码块放在一起。嗯,我试过了,但数字似乎不正确。查看表本身,1个客户的最大订单数量是20(因此他订购了20个productID=1),但在运行查询时,显示他订购了180。@Michelle。在这种情况下,连接可能是通过沿两个不同的维度连接来成倍增加行。您需要修复连接以获得所需的内容。我在交叉应用中发现一个错误,“FROM Sales.salesforderheader soh on soh.customerID=CTE_topcusters.customerID。”它在“on”附近显示了不正确的语法我所做的一切似乎都无法修复它……如果没有实际的表和在我编写时运行查询的可能性,那么很难正确地编写所有内容。下次提出此类问题时,请提供代码以使用示例数据创建示例表。不管怎么说,我很高兴你能成功。
SELECT
CTE_TopCustomers.CustomerID
,CTE_TopCustomers.[Amount Purchased]
,CTE_Products.ProductID
,CTE_Products.ProductName
,CTE_Products.SumCustomerProductQty
FROM
CTE_TopCustomers
CROSS APPLY
(
SELECT TOP (1)
p.ProductID
,p.name AS ProductName
,SUM(sod.orderqty) AS SumCustomerProductQty
FROM
Sales.SalesOrderHeader soh on soh.CustomerID = CTE_TopCustomers.CustomerID
inner join Sales.SalesOrderDetail sod on sod.SalesOrderID = soh.SalesOrderID
inner join Production.Product p on p.ProductID = sod.ProductID
GROUP BY
p.ProductID
,p.name
ORDER BY SumCustomerProductQty DESC
) AS CTE_Products
ORDER BY [Amount Purchased] DESC;