1

簡単な会計SQLステートメントを実行しようとしていますが、いくつかの問題が発生しています。

3 つのテーブル登録、イベント、および支払いテーブルがあります。登録は個々のトランザクションであり、イベントはサインアップした内容に関する情報であり、支払いはイベントに対する支払いです。

登録によって支払われた金額を合計し、イベント名とイベント開始日を列に入れ、それまでに支払われた金額を合計したいと思います。可能であれば、未払いの総額も知りたいです。一番下は支払い総額以外のすべてを把握していると思います。支払額の合計が本来よりもはるかに大きくなっています。おそらく、SUM を使用すると、ネストが原因で支払が複数回カウントされます。

select 
  sum(`reg_amount`) as total, 
  event_name, 
  event_startdate, 
  (
    select sum(payment_amount) as paid 
    from registrations 
    group by events.event_id
  ) pay
FROM registrations 
  left join events 
    on events.event_id = registrations.event_id
  left join payments 
    on payments.event_id = events.event_id
group by registrations.event_id
4

1 に答える 1

2

まず、エイリアスを使用して、すべてのフィールドがどこから来たのかを知る必要があります。からではなく、テーブルpayment_amountから来ていると思います。paymentsregistrations

その場合、サブクエリは、登録のすべての行の外部テーブルからの支払いを合計しています。おそらくあなたが望むものではありません。

私はあなたがこのようなものが欲しいと思います:

select sum(`reg_amount`) as total, 
       e.event_name, 
       e.event_startdate, 
       p.TotPayements
FROM registrations r left join
     events e
     on e.event_id = r.event_id left join
     (select event_id, sum(payment_amount) as TotPayments
      from payments
      group by event_id
     ) p
     on p.event_id = e.event_id
group by r.event_id;

アイデアは、参加による重複を避けるために、可能な限り低いレベルで支払いを集約することです。つまり、結合するに集約します。

これは正しい SQL に関する推測ですが、正しい道をたどるはずです。

于 2013-04-02T18:00:29.837 に答える