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」が不明です。

4

1 に答える 1

2

最初は、SUM のような集計関数をそのように使用することはできません。それらの最終結果は、クエリの結果セットを完成させながら計算されるため、構文エラーがなくても、計算結果が有効ではありませんでした。
2 番目の問題は、同じクエリの同じ select 句でエイリアス名を使用できないため、次のような別の方法を使用することをお勧めします。

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

私が言ったように、このクエリの構文は有効ですが、結果は正しくなく、正しい方法は少し長くなります(サブクエリを使用するなど)。

于 2012-04-23T10:14:04.170 に答える