2012-02-12 218 views
2

,所以我有產品表相關子查詢的MySQL

Product ID | Product Name 
===========+=============== 
1   | Tissues 
2   | Glass 

我有銷售

Sale ID | Product ID | Quantity | Price 
===========+============+==========+============= 
1   | 1   | 1  | 55 
2   | 2   | 1  | 60 

一個表,我有購買

Batch ID | Total Value | Quantity | Product ID 
=========+=============+==========+================== 
1  | 100   | 100  | 1 
2  | 10   | 50  | 2 
3  | 1   | 1  | 2 

所以我嘗試的表根據平均成本計算利潤使用查詢

SELECT tblsale.product_id, 
     tblproduct.product_name, 
     SUM(tblsale.`quantity`) qty, 
     SUM(tblsale.`Price`*tblsale.`quantity`) sales, 
     (SELECT sum(total_value)/sum(quantity) VWAP 
     FROM tblpurchases 
     WHERE product_id = tblsale.product_id) average_price, 
     (average_price * qty) cost, 
     (sales-cost) profit 
FROM tblsale, tblproduct 
WHERE tblproduct.product_id = tblsale.`product_id` 
GROUP by tblsale.`product_id` 

但我似乎無法得到它的工作,我收到了「平均價」是一個未知的專欄中,我將如何構建查詢正確

+0

什麼是「總價值」和「數量」? – 2012-02-12 16:39:55

+0

總價值是所有商品在採購中的價值,數量是商品的單位數量(所以價值/數量)將是該特定批次的平均價格 – Akshat 2012-02-12 19:23:49

回答

2

SQL不支持在同一個SELECT子句中引用列別名 - 這就是爲什麼您的average_price列正在返回1054錯誤。您必須在子查詢中進行所需的任何操作,派生表/內聯視圖,或者在必要時重新使用基礎邏輯。這裏是一個邏輯重用的例子:

SELECT prod.product_id, 
      prod.product_name, 
      SUM(s.quantity) qty, 
      SUM(s.Price * s.quantity) sales, 
      SUM(pur.total_value)/SUM(pur.quantity) average_price, 
      SUM(pur.total_value)/SUM(pur.quantity) * SUM(s.quantity) cost, 
      SUM(s.Price * s.quantity) - (SUM(pur.total_value)/SUM(pur.quantity) * SUM(s.quantity)) profit 
    FROM tblproduct prod 
LEFT JOIN tblsale s ON prod.product_id = s.product_id 
LEFT JOIN tblpurchases pur ON pur.product_id = prod.product_id 
GROUP BY s.product_id 

我的查詢是使用ANSI-92 JOIN語法,我推薦使用ANSI-89語法查詢使用。請參閱this question for more details

+0

嗯,我想知道。這比內部選擇運行速度快嗎? – 2012-02-12 18:43:15

+0

@MostyMostacho:子選擇性能取決於 - 對於大多數數據庫,標量性能相同。但其他人需要檢查,因爲他們可以逐行執行(不好)。 – 2012-02-12 18:45:25

+0

這樣想。感謝您的信息:) – 2012-02-12 18:46:55

-1

你是怎麼到這個查詢?它完全關閉。在編寫查詢時,從小處開始,然後構建它。你現在的查詢是一個完整的混亂,並沒有接近有效,有一個隨機括號'通過它。

,使一個開始,使用縮進,使您的查詢可讀

SELECT p.product_id, p.product_name 
     , SUM(s.quantity) number_of_sales 
     , SUM(s.price) total_profit 
     , SUM(pu.quantity) purchase_quantity 
     , SUM(pu.value) purchase_value 
     , (SUM(pu.quantity) - SUM(s.quantity)) number_in_stock 
     , (SUM(s.price) - SUM(pu.value)) profit 
     , (SUM(pu.value)/SUM(pu.quantity)) avarage_purchase_price 
     FROM product p 
LEFT JOIN sales s ON s.product_id = p.product_id 
LEFT JOIN purchase pu ON pu.product_id = p.product_id   
    GROUP BY s.product_id, pu.product_id 

但我似乎無法得到它的工作,我收到了‘平均價’是未知列,怎麼會我正確地構建查詢

'平均價格'是什麼?您希望如何計算平均價格? '平均成本'相同

+0

平均成本和平均價格將是相同的,平均值花費所有購買記錄的加權平均成本 – Akshat 2012-02-12 19:24:24