相关子查询mysql

时间:2012-02-12 15:57:00

标签: mysql sql aggregate-functions mysql-error-1054

所以我有一张产品表

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`

但我似乎无法将其付诸实践,我的平均价格为#39;是一个未知的列,我将如何正确构建查询

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-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

" 但我似乎无法让它工作,我的平均价格是'是一个未知的列,我将如何正确构建查询"

什么是'平均价格&#39 ;?您希望如何计算平均价格?同样的平均成本'