1

左結合の SQL クエリに問題がありますが、なぜ機能しないのかわかりません。顧客、購入、支払いの 3 つのテーブルがあり、合計購入費用が合計支払いよりも少ない (つまり、残高が 0 より大きい) 顧客を選択しようとしています。

これまでのところ、私は次のものを持っています:

テーブル:

Customers

id | Name


Purchases

id | customerid | cost


Payments

id | customerid | paymentamount 

SQL クエリ:

SELECT  a.*, 
COALESCE(b.totalCost , 0) as totalCost, 
COALESCE(c.totalPayments , 0) as totalPayments, 
COALESCE(b.totalCost , 0) - COALESCE(c.totalPayments , 0) AS Balance 
FROM customers a 
LEFT JOIN (SELECT  customerid, SUM(cost) AS totalCost FROM purchases GROUP BY customer) b ON a.id = b.customerid 
LEFT JOIN (SELECT customerid, SUM(paymentamount) AS totalPayments FROM payments GROUP BY customerid) c ON a.id = c.customerid 
WHERE Balance > 0"

クエリを実行すると、Balance を定義しているにもかかわらず、「WHERE 句」の「Unknown column 'Balance'」というエラーが表示されます。

どんな助けでも大歓迎です。ありがとう!

4

2 に答える 2

3

なぜならBALANCE、式に与えられた ALIAS だからです。WHEREの代わりに句で式を使用します。ALIAS

WHERE   COALESCE(b.totalCost , 0) - COALESCE(c.totalPayments , 0) > 0

WHEREもう 1 つの方法は、ステートメント全体をサブクエリでラップして、外側のクエリの句でエイリアスを使用できるようにすることです。

句とALIAS同じレベルで作成された を使用できない理由は、 が作成された句よりも句が最初に実行されるためです。WHEREWHERESELECTALIAS

SQL の操作順序は次のとおりです。

  • FROM 句
  • WHERE句
  • GROUP BY 句
  • HAVING 句
  • SELECT句
  • ORDER BY 句
于 2013-05-18T13:44:06.967 に答える
2

残念ながら、エイリアスが定義されているのと同じ「レベル」でエイリアスを参照することはできません。

すべてを派生テーブルにラップする必要があります。

select *
from (
   <your query goes here>
) t
where balance > 0
于 2013-05-18T13:43:45.153 に答える