2017-11-20 6 views
0

各製品が最も売れる都市を見つけなければならない。 私はかなり近づいていると感じますが、次に試してみたいことに困惑しています。私は約8時間の間、この課題に取り組んできました(過言ではありません)。SQL:各製品が最も売れているが、近いが完全ではない都市

これらのテーブルがあります。

Tb_Product (prod_id, name, MU) 
Tb_Supplier (supp_id, name, city) 
Tb_Consumer (con_id, name, city) 
Tb_Requests (quantity, prod_id, price, con_id) 
Tb_Offers (quantity, prod_id, price, supp_id) 
Tb_Transactions (quantity, price, prod_id, supp_id, con_id, tran_id) 

は、私がこれまでに次き:

SELECT DISTINCT Tb_Product.Name, Tb_Supplier.City, SUM(Quantity) AS 'Quantity Sold' 
FROM Tb_Supplier, Tb_Transactions, Tb_Consumer, Tb_Product 
WHERE Tb_Supplier.Supp_ID = Tb_Transactions.Supp_ID 
AND Tb_Product.Prod_ID = Tb_Transactions.Prod_ID 
GROUP BY Tb_Product.Name, Tb_Supplier.Supp_ID, Quantity, Tb_supplier.City 
HAVING SUM(Quantity) >= ALL(SELECT SUM(Quantity) 
         FROM Tb_Supplier, Tb_Transactions 
         WHERE Tb_Transactions.Supp_ID=Tb_Supplier.Supp_ID 
         GROUP BY Quantity) 

と私が手出力は次のようである:明らかに

Name       City       Quantity Sold 
------------------------------ ------------------------------ ---------------------- 
Airplane      Madison      3900000 
Auto       Madison      3900000 
Computer      Madison      3900000 
Milk       Madison      3900000 
Oil       Madison      3900000 
Orange       Madison      3900000 
Truck       Madison      3900000 
TV        Madison      3900000 

販売数量正しいものではないと私はSUM(Quantity)を上に持っていなければならないと信じていますが、何を変更するかを知ることはできません。この場合JOIN

+1

クエリに4つのテーブルが含まれていますが、2つの結合条件しか表示されません。あなたはテーブル定義を含めることができますか? –

+0

サプライヤー - supp_id、名前、都市 消費者 - con_id、名前、都市 製品 - PROD_ID、名前、MU 要望 - 数量、PROD_ID、価格、 オファーをcon_id - 数量、PROD_ID、価格、 取引supp_id - 数量、価格、prod_id、supp_id、con_id、tran_id –

答えて

0

WHERE

SELECT p.Name, s.City, SUM(t.Quantity) AS 'Quantity Sold' 
FROM Tb_Supplier s 
JOIN Tb_Transactions t ON t.Supp_ID = s.Supp_ID 
JOIN Tb_Consumer c ON c.con_id = t.con_id -- I think you forgot this condition 
JOIN Tb_Product p ON p.Prod_ID = t.Prod_ID 
GROUP BY p.Name, s.Supp_ID, s.City 
HAVING SUM(t.Quantity) >= ALL(
      SELECT SUM(Quantity) 
      FROM Tb_Transactions 
      GROUP BY Supp_ID,prod_id -- check it 
     ) 

よりも非常に有用であり、私は次のクエリを試してみてくださいQuantityGROUP BY

GROUP BY Tb_Product.Name, Tb_Supplier.Supp_ID, /*Quantity,*/ Tb_supplier.City 

に必要ではないと思われる

SELECT 
    p.name, 
    d.city, 
    d.QSold 
FROM 
    (
    SELECT t.prod_id,s.city,SUM(t.Quantity) QSold 
    FROM Tb_Transactions t 
    JOIN Tb_Supplier s ON s.supp_id=t.supp_id 
    GROUP BY t.prod_id,s.city 
) d 
JOIN 
    (
    SELECT prod_id,MAX(QSold) MaxQSold 
    FROM 
     (
     SELECT t.prod_id,s.city,SUM(t.Quantity) QSold 
     FROM Tb_Transactions t 
     JOIN Tb_Supplier s ON s.supp_id=t.supp_id 
     GROUP BY t.prod_id,s.city 
    ) d 
    GROUP BY prod_id 
) m 
ON d.prod_id=m.prod_id AND d.QSold=m.MaxQSold 
JOIN Tb_Product p ON d.prod_id=p.prod_id 

かあなたのバージョンであればこのクエリSQLServerののウィンドウの機能をサポートしてい

SELECT name,city,QSold 
FROM 
    (
    SELECT t.prod_id,p.name,s.city,SUM(t.Quantity) QSold, 
     MAX(SUM(t.Quantity))OVER(PARTITION BY t.prod_id) MaxQSold 
    FROM Tb_Transactions t 
    JOIN Tb_Supplier s ON s.supp_id=t.supp_id 
    JOIN Tb_Product p ON t.prod_id=p.prod_id 
    GROUP BY t.prod_id,p.name,s.city 
) q 
WHERE QSold=MaxQSold 
0

「各製品が販売されている市はは」消費の都市を意味し、あなたがその都市や製品によって数量を合計し、消費者に取引に参加する必要があります。 "most"に到着するには、dense_rank()の数量(降順)と1のランクで注文することができますので、 "最も売れた"となります(注:dense_rank()を使用して1位に等しい) 。

SELECT 
     d.city 
    , p.name 
    , d.sum_qty 
FROM (
     SELECT 
      c.city 
      , SUM(t.quantity) sum_qty 
      , t.prod_id 
      , DENSE_RANK() OVER (PARTITION BY c.city, t.prod_id ORDER BY SUM(t.quantity) DESC) rnk 
     FROM Tb_Transactions t 
     JOIN Tb_Consumer c ON t.con_id = c.con_id 
) d 
JOIN Tb_Product p ON d.Prod_ID = p.Prod_ID 
WHERE d.rnk = 1 
ORDER BY 
     d.city 
    , p.name 

副問合せの結果を製品表に結合すると、その結合に含まれる行が少なくなります。

nb:dense_rankを使用すると、「上位n個」の結果も得られます。 where句をwhere rnk <= 5に変更すると、都市ごとに上位5個の販売商品がリストされます。

関連する問題