2017-10-15 74 views
2

我试图得到一个查询,以显示产品销量最高的产品名称和城市。以下是我正在使用的代码:显示产品名称和城市,该产品的销售量最大

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

从截图中有每个产品(飞机,汽车,船舶......)的多条记录。我试图为购买量最高的每个产品获取单个记录。 因此,最高纪录只会显示飞机,因为大部分订单都来自那里。

+0

后的样本数据,并基于该样本数据所需的输出 - 我不完全相信,我明白你的问题,以及我最初以为我做到了。 – Brian

+0

运行查询时添加了输出的屏幕截图。 –

回答

0

您想使用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

enter image description here

+0

如果我想改变S.City为S.Name,那看起来怎么样?我不断收到一个错误,指出“名称”已多次指定。 –

+0

@CameronErwin是“S.Name”供应商的名称?这是使用唯一字段名称(甚至跨表格)的好理由。您需要像'S.Name AS SupplierName'中一样创建一个别名。 –

0

对于这一点,我会用一个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 
+0

这看起来很重要,但是,我试图继续使用目前的代码格式,因为我不知道CTE是什么。感谢您的输入! –

+1

如果你不知道CTE(公共表表达式)是什么......那么这是关于你做的时间......让SQL更容易编写 – Harry

+0

其实,现在我想到了它,我不确定这是否正确 - 看到我对你最初的问题的评论,@CameronErwin – Brian