2011-01-16 11 views
0

私はこのクエリで本当に苦労しています。私は4つのテーブル(http://oberto.co.nz/db-sql.png)を持っています:mySQLは複数のテーブルに結合します

Invoice_Payement、Invoice、Client and Calendar Invoice_Paymentの 'paid_amount'列を月/年ごとに合計してレポートを作成しようとしています。クエリはすべての月含む必要

  • 、さらにそれらデータのない
  • ありクエリは、条件(請求書テーブル)必要があります。私は以下のクエリと試みたregistered_id = [ID]

をこれはうまくいきますが、 'paid_date'には1か月間のレコードがない場合は短くなります。結果はその月が結果に表示されないことです

これを解決するためにカレンダーテーブルを追加しましたが、残しておく方法はわかりません。

SELECT 
    MONTHNAME(Invoice_Payments.date_paid) as month, 
    SUM(Invoice_Payments.paid_amount) AS total 
FROM Invoice, Client, Invoice_Payments 
WHERE Client.registered_id = 1 
AND Client.id = Invoice.client_id 
And Invoice.id = Invoice_Payments.invoice_id 
AND date_paid IS NOT NULL 
GROUP BY YEAR(Invoice_Payments.date_paid), MONTH(Invoice_Payments.date_paid) 

私のシナリオの基本的なERD図については、上記のリンクをご覧ください。

データベース:http://oberto.co.nz/ 予想される出力:読書のため

month  total 
August  5 
September 0 
October 196 
November 205 
December 214 
January 229 

ありがとう:私の現在のクエリは、以下のようなものを返します。 私は前にこのQを投稿しましたが、私はそれを悪く言いました。

+0

を作業することができますが、各月の合計のリストだけをしたいですか? WHERE句に "date_paid IS NOT NULL"が必要なのはなぜですか? Invoice_Paymentsテーブルに、実際にdate_paidがnullの支払いがありますか? – James

答えて

0

更新に参加する左client.id = invoice.client_id上のクライアントに参加左?

SELECT YEAR(calendar.date_field) as year, 
MONTHNAME(calendar.date_field) as month, 
SUM(Invoice_Payments.paid_amount) AS total 
FROM calendar 
left outer join invoice_Payments on calendar.date_field = invoice_Payments.date_paid 
left outer join Invoice on invoice_payments.invoice_id = invoice.invoice_id 
left outer join (select * from client where registered_id = 1) as c on c.id = Invoice.client_id 
GROUP BY YEAR(calendar.date_field), MONTH(calendar.date_field) 
+0

ありがとう、ありがたいです。 Invoice_Payments.date_paidレコードがない月が表示されないことを除いて動作します。そのため、私はカレンダーテーブルの左結合を行う必要があると仮定しています。 – Jarrod

+0

これはどうですか? – JoshRoss

+0

ほぼ!制限...とClient.registered_id = 1が無視されている以外は、すべてのデータが正しく返されています。だから私はすべてのIdのために返されたデータを取得し、指定されたIDは返しません。これは簡単なファイルですか? – Jarrod

0

左結合を実行していないという問題は明らかです。左結合を指定することができる結合構文を使用するようにクエリを書き直すことがソリューションになる可能性があります。 P、ウィルこの作品:請求書から

選択*のようなものは

そしてそう

+0

ありがとうMTilsted。私は左の結合が必要であることを理解しています。左の結合を作成することはできますが、他の条件を追加すると、それを解決できないようです。 – Jarrod

+0

まあ正しい答えがこの答えのすぐ下にあるように見えます:} – MTilsted

0

また、これは...

SELECT MONTHNAME(Invoice_Payments.date_paid) as month, SUM(Invoice_Payments.paid_amount) AS total 
FROM Client 
LEFT OUTER JOIN Invoice ON Client.id = Invoice.client_id 
LEFT OUTER JOIN Invoice_Payments ON Invoice.id = Invoice_Payments.invoice_id 
WHERE Client.registered_id = 1 AND date_paid IS NOT NULL 
GROUP BY YEAR(Invoice_Payments.date_paid), MONTH(Invoice_Payments.date_paid); 
+1

この質問は1歳以上です。既存のクエリの回答がどのように改善するか説明できますか? – GargantuChet

関連する問題