2013-04-15 147 views
0

標題混淆? :)來自2個表的SQL連接,從第三個連接的數據分組

我試圖從我的購物車數據庫中生成有用的報告。

有一個表orders包含「date_ordered」(和一堆其他的東西我不關心)和鍵「orders_id」

第二個表,orders_products,具有相同的「orders_id」鍵並有關於命令的信息。特別是,我對「products_id」,「products_quantity」和「final_price」感興趣

我想要做的是生成銷售報表,顯示數量*價格的總和,並在date_ordered爲兩個日期。我可以這樣做:

SELECT op.products_id AS 'PID', 
    SUM(op.products_quantity) AS 'sales Q', 
    SUM(op.final_price * op.products_quantity) AS 'sales $' 
FROM orders o 
JOIN orders_products op 
ON o.orders_id = op.orders_id 
WHERE o.date_purchased 
BETWEEN '2012-01-01' AND '2012-12-31' 
GROUP BY op.products_id 

這似乎工作正常。但是現在我「簡單地」想要在顯示產品名稱的報告中添加另一列。該數據位於「products_name」列中的另一個表中,products_description。所以,我想這一點:

SELECT pd.products_name AS 'Product', 
    op.products_id AS 'PID', 
    SUM(op.products_quantity) AS 'sales Q', 
    SUM(op.final_price * op.products_quantity) AS 'sales $' 
FROM orders o 
JOIN orders_products op 
ON o.orders_id = op.orders_id 
JOIN products_description pd 
ON op.products_id = pd.products_id 
WHERE o.date_purchased 
BETWEEN '2012-01-01' and '2012-12-31' 
GROUP BY op.products_id 

,起初它似乎工作,直到我發現所有的銷售Q和美元銷售額的數字是他們應該是3倍的東西。

它超出了我的掌握能力:)幫助讚賞。

+0

嘗試在group by子句 –

+0

中添加pd.products_name如果產品ID的數字乘以3,我猜這是因爲products_description表包含相同產品ID的3行,不是嗎? – Walid

+0

@Nikita ......奇怪的是,這使服務器崩潰!大聲笑。我嘗試重新啓動並重新執行,同樣的事情......它凍結。 WEIRD – bcsteeve

回答

1

另一件事......正如其他人提到的將產品名稱添加到group by子句中,您似乎仍然有某種笛卡爾結果。如果不知道實際的數據,你可能要包裝你查詢了類似...

select 
     pd.products_name AS 'Product', 
     PreQuery.* 
    from 
     (SELECT 
       op.products_id AS 'PID', 
       SUM(op.products_quantity) AS 'sales Q', 
       SUM(op.final_price * op.products_quantity) AS 'sales $' 
      FROM 
       orders o 
       JOIN orders_products op 
        ON o.orders_id = op.orders_id 
      WHERE 
       o.date_purchased BETWEEN '2012-01-01' and '2012-12-31' 
      GROUP BY 
       op.products_id) PreQuery 
     JOIN products_description pd 
     ON PreQuery.PID = pd.products_id 

這應該作爲內部查詢做的結果就只是PID全部捲起。然後,獲取該結果並加入產品說明表。

如果您仍然得到每個項目的重複項,那麼您的產品說明表似乎會有多個相同產品ID的記錄...例如存在較高的唯一性鍵,但可能存在具有多個狀態的相同產品,類型,不管是什麼原因造成的。

+0

感謝您向我展示PreQuery ...全新的概念。正如我在評論中提到的,你們是對的,在products_description中有三重條目。所以我很煩惱自己沒有看到它,並浪費你的時間......但我很高興,因爲我看到了一種新的做事方式!謝謝。 – bcsteeve