2012-04-23 69 views
1

我正在嘗試創建一個查詢,該查詢在同一個查詢中使用另一個計算的計算字段,但它給了我一個錯誤。在同一查詢中重複使用計算的字段進行新計算

如何以替代方式完成此操作。

查詢:

SELECT MIN(q.order_created) AS first_ordered,   
     MAX(q.order_created) AS last_ordered, 
     SUM(IF(DATE_ADD(q.order_created,INTERVAL 12 MONTH) >= NOW(),pq.product_qty,0))/12 AS monthly_rate,      
     SUM(pq.product_qty) AS yearly_sales, 
     SUM((pq.product_cost_price * pq.product_qty) - pq.product_total_price) AS **net_sold**, 
     SUM(pq.product_cost_price * pq.product_qty) AS **total_ordered**, 
     **100 - ((total_ordered - net_sold)/total_ordered)*100 AS discount**, 
     q.billing_account_id AS custid 
FROM quotes q 
LEFT JOIN products_quotes pq 
    ON q.id = pq.quote_id 
WHERE pq.product_id = '28e96e3d-460f-49fc-7d52-4f390b86d6b8' 
    AND q.deleted = 0 
    AND pq.deleted = 0 
GROUP BY q.billing_account_id 
ORDER BY q.order_created 
GROUP BY q.billing_account_id 
ORDER BY q.order_created 

給出錯誤: '字段列表' 未知列 'total_ordered'。

回答

1

首先,您不能像SUM那樣使用聚合函數,因爲它們的最終結果將在完成查詢的結果集時計算,因此即使它沒有語法錯誤,計算結果也是無效的。
而第二個問題是,你不能相同查詢的相同選擇子句中使用別名,所以你可能需要使用其他方法像這樣的:

SELECT MIN(q.order_created) AS first_ordered,   
     MAX(q.order_created) AS last_ordered, 
     SUM(IF(DATE_ADD(q.order_created,INTERVAL 12 MONTH) >= NOW(),pq.product_qty,0))/12 AS monthly_rate,      
     SUM(pq.product_qty) AS yearly_sales, 
     SUM((pq.product_cost_price * pq.product_qty) - pq.product_total_price) AS net_sold, 
     SUM(pq.product_cost_price * pq.product_qty) AS total_ordered, 
     100 - ((SUM(pq.product_cost_price * pq.product_qty) - SUM((pq.product_cost_price * pq.product_qty) - pq.product_total_price))/SUM(pq.product_cost_price * pq.product_qty))*100 AS discount, 
     q.billing_account_id AS custid 
FROM quotes q 
LEFT JOIN products_quotes pq 
    ON q.id = pq.quote_id 
WHERE pq.product_id = '28e96e3d-460f-49fc-7d52-4f390b86d6b8' 
    AND q.deleted = 0 
     AND pq.deleted = 0 
GROUP BY q.billing_account_id 
ORDER BY q.order_created 
GROUP BY q.billing_account_id 
ORDER BY q.order_created 

注意,我說的語法這個查詢是有效的,但結果不是&正確的方法是稍長一點(就像使用子查詢)。