【问题标题】:Obtain the top-grossing product for each individual vendor为每个单独的供应商获得最畅销的产品
【发布时间】:2019-10-19 07:25:12
【问题描述】:

我如何获得每个供应商最畅销的产品?

到目前为止,我想出了这个,但似乎无法继续。

select vendor.Vendor_Name, Product.category AS Product
  , SUM(SalesFacts.Price * SalesFacts.Quantity) AS [Total Revenue]
FROM Vendor, Product, SalesFacts
WHERE SalesFacts.Vendor_Key = Vendor.Vendor_Key
AND SalesFacts.Product_Key = Product.Product_Key
GROUP BY vendor.Vendor_Name, product.Category
ORDER BY [Total Revenue] DESC;

(Product_Key 和 Vendor_Key 是外键)

【问题讨论】:

标签: sql sql-server


【解决方案1】:
 select vendor.Vendor_Name,Product.category AS Product,
       MAX(SalesFacts.Price * SalesFacts.Quantity) OVER (PARTITION BY 
          SalesFacts.Vendor_Key,SalesFacts.Product_Key ORDER BY SalesFacts.Vendor_Key ) AS 
          [Total Revenue] FROM Vendor
      ,Product,SalesFacts WHERE SalesFacts.Vendor_Key = Vendor.Vendor_Key AND 
    SalesFacts.Product_Key = Product.Product_Key 
  --GROUP BY vendor.Vendor_Name,product.Category,SalesFacts.Price,SalesFacts.Quantity
   ORDER BY [Total Revenue] DESC;

【讨论】:

    【解决方案2】:

    你可以用这个。

    SELECT * FROM (
        SELECT 
            vendor.Vendor_Name, 
            Product.Category AS Product,
            ROW_NUMBER() OVER(PARTITION BY vendor.Vendor_Name ORDER BY SUM(SalesFacts.Price * SalesFacts.Quantity)  DESC) RN
        FROM Vendor
            INNER JOIN SalesFacts ON SalesFacts.Vendor_Key = Vendor.Vendor_Key
            INNER JOIN Product ON SalesFacts.Product_Key = Product.Product_Key 
        GROUP BY vendor.Vendor_Name, product.Category   
    ) X
    WHERE X.RN = 1
    

    【讨论】:

      【解决方案3】:

      我不明白为什么“类别”应该是产品。更重要的是,您应该修复您的查询:

      • 从不FROM 子句中使用逗号。
      • 始终使用正确、明确、标准 JOIN 语法。
      • 使用有意义的表别名。

      产品级别,这将是:

      SELECT Vendor_Name, Product
      FROM (SELECT v.Vendor_Name, p.Description AS Product,
                   ROW_NUMBER() OVER (PARTITION BY v.Vendor_Key ORDER BY SUM(sf.Price * sf.Quantity) DESC) as seqnum
            FROM SalesFacts sf JOIN
                 Vendor v
                 ON sf.Vendor_Key = v.Vendor_Key JOIN
                 Product p
                 ON sf.Product_Key = p.Product_Key 
            GROUP BY v.Vendor_Key, v.Vendor_Name, p.Product_Key, p.Description   
           ) vp
      WHERE vp.seqnum = 1;
      

      这可以很容易地修改为适用于该类别,但问题是“产品”,并且数据具有与之对应的内容。

      【讨论】:

        猜你喜欢
        • 2016-03-03
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多