【问题标题】:Display Product Name and City where that product sold in largest quantity显示产品名称和该产品销量最大的城市
【发布时间】:2017-10-15 19:37:34
【问题描述】:

我正在尝试查询以显示产品销售量最高的产品名称和城市。这是我正在使用的代码:

SELECT DISTINCT
  (s.city),
  MAX(t.quantity),
  p.Name
FROM [DS715-Cameron-Erwin].dbo.Tb_Transactions AS t,
     [DS715-Cameron-Erwin].dbo.Tb_Product AS p,
     [DS715-Cameron-Erwin].dbo.Tb_Supplier AS s
WHERE p.prod_id = t.prod_id
AND s.Supp_ID = t.Supp_ID
GROUP BY t.Prod_ID,
         p.name,
         s.city
ORDER BY p.name, s.city

这是每个城市每种产品的最高销量。

Sample Data

从屏幕截图中,每个产品(飞机、汽车、船...)都有多个记录。我正在尝试为购买量最高的每种产品获取一条记录。 因此,最高记录只会显示在飞机上,因为大多数订单都来自那里。

【问题讨论】:

  • 发布示例数据和基于该示例数据的所需输出 - 我不完全确定我是否像我最初认为的那样理解您的问题。
  • 添加了运行查询时的屏幕截图。

标签: sql sql-server


【解决方案1】:

您想使用ROW_NUMBER() OVER 功能按数量订购,然后选择每个产品中数量最多的一个。

SELECT
  city,
  quantity,
  name
FROM  
(

    SELECT  S.city,
            T.quantity,
            P.name,
            ROW_NUMBER() OVER
              ( PARTITION BY
                P.name
                ORDER BY t.Quantity DESC
              ) as RowNum
    FROM
            Tb_Transactions T
                INNER JOIN
            Tb_Product P
                ON
              P.prod_id = T.prod_id
                INNER JOIN
            Tb_Supplier S
                ON
              S.supp_id = T.supp_id
 ) a
 WHERE
     RowNum = 1

http://sqlfiddle.com/#!6/628458/5

【讨论】:

  • 如果我想将 S.City 更改为 S.Name 会怎样?我不断收到一条错误消息,提示“名称”已被多次指定。
  • @CameronErwin 是S.Name 供应商的名称?这是使用唯一字段名称(甚至跨表)的一个很好的理由。您需要创建一个别名,如 S.Name AS SupplierName。
【解决方案2】:

为此,我会使用 CTE(我也会使用显式的 INNER JOIN 语法):

;With CTE
As
(
    Select
        s.city
        , t.quantity
        , p.Name  
        , Row_Number Over (Partition By P.Name, s.city Order By t.Quantity Desc) as RN
    From [DS715-Cameron-Erwin].dbo.Tb_Transactions as t 
        Inner Join [DS715-Cameron-Erwin].dbo.Tb_Product as p
            On p.prod_id = t.prod_id
        Inner Join [DS715-Cameron-Erwin].dbo.Tb_Supplier as s
            On s.Supp_ID = t.Supp_ID
)
Select
    city
    , quantity
    , Name
From CTE
Where RN = 1

【讨论】:

  • 这看起来很重要,但是,我试图保持我的代码的当前格式,因为我不知道 CTE 是什么。感谢您的意见!
  • 如果你不知道什么是 CTE(公用表表达式).. 那么是时候了解了.. 让 SQL 更容易编写
  • 实际上,现在我想起来了,我不确定这是否正确 - 请参阅我对您最初的问题的评论,@CameronErwin
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多