Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 寻找最受欢迎的产品_Sql_Sql Server - Fatal编程技术网

Sql 寻找最受欢迎的产品

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

我正试图写一个查询,根据他们购买的所有产品的数量,将前5名客户拉出来。没问题。但除此之外,我需要找到这5位客户中最受欢迎的产品

我想我可以通过查看他们购买最多的产品来做到这一点(因此productID的数量是最大数量),但我不太确定如何获得productID。有什么想法吗?我这样做完全错了吗?谢谢

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;