【问题标题】:How to return top x distinct sum of sales?如何返回前 x 不同的销售额总和?
【发布时间】:2021-06-06 04:23:04
【问题描述】:

我非常坚持解决在 SQL 中获得我想要的东西的问题。我已经能够在 excel 中实现相同的目标,但我正在将解决这个问题作为一个学习步骤,以便更好地理解 SQL。想象一下以下两个 Excel 表在 SQL Server 数据库中也是 1:1 的:

产品

销售 - 这有 8000 行

而我想看到的结果如下:

到目前为止,我已经能够使用以下 SQL 脚本获取每个类别和产品名称的计数:

SELECT
dp.ProductCategoryName,
dp.ProductName,
sum(fs.SalesAmount) as 'TotalSalesAmount'
FROM 
dbo.Product dp
JOIN dbo.Sales fs ON 
fs.ProductID = dp.ProductID
GROUP BY 
dp.ProductCategoryName, dp.ProductName, fs.SalesAmount
ORDER BY 
sum(fs.SalesAmount)

但这与我想要的结果相差甚远。我想计算每个类别下每个产品的总销售额,然后只返回每个类别中销量最高的前 2 个产品。我不确定在计算总和时如何获得不同的产品名称和类别。有人可以帮我解决这个问题,因为这一切都非常令人困惑!我正在尝试了解我需要采取的步骤。

【问题讨论】:

    标签: sql distinct


    【解决方案1】:

    您可以使用这样的函数来实现一个类别的最高 2 行:

    CREATE FUNCTION getTop2 (@category AS int) 
    RETURNS @result TABLE 
    (category AS int,
        prodId AS int,
        salesSum AS int) 
    AS 
    BEGIN
    INSERT INTO @result
    SELECT top 2 p.category ,
               s.prodId ,
               sum(sales) AS saleasSum
    FROM tblsales AS s
    INNER JOIN tblProd AS p ON p.id = s.prodId 
    WHERE p.category  = @category 
    GROUP BY p.category ,
             s.prodId 
    ORDER BY saleasSum DESC 
    RETURN 
    END;
    

    【讨论】:

    • 不创建函数有什么办法吗?
    • 也许通过使用带光标的循环?
    【解决方案2】:

    给你:

    select * into Product from (
    values(1,'Bike','Auto'),
    (2,'Car','Auto'),
    (3,'Truck','Auto'),
    (4,'Wheat','Grain'),
    (5,'Rice','Grain'),
    (6,'Barley','Grain'),
    (7,'Eggplant','Vegetable'),
    (8,'Okra','Vegetable'),
    (9,'Cabage','Vegetable')) as t(Productid, ProductName,ProductCategoryName)
    
    select * into Sales from (
    values ('2021-06-06',1,10000),
    ('2021-06-06',2,20000),
    ('2021-06-06',3,100000),
    ('2021-06-06',4,2000),
    ('2021-06-06',5,2500),
    ('2021-06-06',6,3000),
    ('2021-06-06',7,100),
    ('2021-06-06',8,200),
    ('2021-06-06',9,300),
    ('2021-06-05',1,1000),
    ('2021-06-05',2,2000),
    ('2021-06-05',3,10000),
    ('2021-06-05',4,200),
    ('2021-06-05',5,250),
    ('2021-06-05',6,300),
    ('2021-06-05',7,10),
    ('2021-06-05',8,20),
    ('2021-06-05',9,30)
    ) as t([Date], Productid,SalesAmount)
    
    Select productCategoryName, Productname, SalesAmount
    from(
    Select
    p.productCategoryName, p.Productname, sum(s.SalesAmount) SalesAmount,
    row_number() over (partition by p.productCategoryName order by sum(s.SalesAmount) desc) rnum
    From Sales s
    join Product p on s.productid = p.productid
    group by p.productCategoryName, p.Productname
    ) a where rnum in (1,2)
    order by productCategoryName, SalesAmount desc
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2018-08-01
      相关资源
      最近更新 更多