2017-10-15 88 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