2

ここで次の sqlfiddle を使用して、これを試した前のクエリのように case ステートメントを使用して2012-04-1、月の間に行われた最新の支払いを見つける方法は次のとおりです。2012-03-31

max(case when py.pay_date >= STR_TO_DATE(CONCAT(2012, '-04-01'),'%Y-%m-%d') and py.pay_date <=  STR_TO_DATE(CONCAT(2012, '-03-31'), '%Y-%m-%d') + interval 1 year  then py.amount end) CURRENT_PAY 

ただし、私が得ている答えは正しくありません。実際の答えは次のとおりです。(12, '2012-12-12', 20, 1)

助けてください、ありがとう。

4

1 に答える 1

2

集約CASE内ではなく、その条件は句に属します。これは、 に参加することによって、最新の支払いを取得するサブクエリに対して参加します。MAX()WHEREperson_idMAX(pay_date), person_id

SELECT payment.* 
FROM 
  payment
  JOIN (
    SELECT MAX(pay_date) AS pay_date, person_id 
    FROM payment 
    WHERE pay_date BETWEEN '2012-04-01' AND DATE_ADD('2012-03-31', INTERVAL 1 YEAR)
    GROUP BY person_id
  ) maxp ON payment.person_id = maxp.person_id AND payment.pay_date = maxp.pay_date
  

これは、テーブルで修正された ID を持つ更新されたフィドルです(それらの束は 15 だったので)。これは、レコード 18 を返します2013-03-28

アップデート

正しいSQL フィドルを見た後...このクエリの結果を既存のクエリに組み込むにはLEFT JOINp.id.

select p.name,
  v.v_name,
  sum(case when Month(py.pay_date) = 4 then py.amount end) april_amount,

   (case when max(py.pay_date)and month(py.pay_date)= 4 then py.amount else 0 end) max_pay_april,

   sum(case 
        when Month(py.pay_date) = Month(curdate())
        then py.amount end) current_month_amount,
   sum(case 
        when Month(py.pay_date) = Month(curdate())-1
        then py.amount end) previous_month_amount,
   maxp.pay_date AS last_pay_date,
   maxp.amount AS last_pay_amount
from persons p
left join vehicle v
  on p.id = v.person_veh
left join payment py
  on p.id = py.person_id
/* LEFT JOIN against the subquery: */
left join (
   SELECT MAX(pay_date) AS pay_date, amount, person_id 
      FROM payment 
      WHERE pay_date BETWEEN '2012-04-01' AND DATE_ADD('2012-03-31', INTERVAL 1 YEAR)
      GROUP BY person_id, amount
    ) maxp ON maxp.person_id = p.id

group by p.name,
  v.v_name
于 2012-09-02T20:48:07.287 に答える