Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 表中最近的条目以一年为间隔_Mysql - Fatal编程技术网

Mysql 表中最近的条目以一年为间隔

Mysql 表中最近的条目以一年为间隔,mysql,Mysql,使用以下SQLFIDLE,我将如何使用前面查询中的案例陈述查找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

使用以下SQLFIDLE,我将如何使用前面查询中的案例陈述查找
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 

max(当py.pay\u date>=STR\u TO\u date(CONCAT(2012,-04-01'),“%Y-%m-%d”)和py.pay\u date时,该条件属于
WHERE
子句中,而不是
max()
聚合中的
案例
,该条件通过在
上加入子查询来获取每个
人员的最新付款(付款日期),个人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
  
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
这是您表中已更正的ID(因为其中有15个)。这将返回记录18,用于
2013-03-28

更新 在看到正确的SQL FIDLE…以将此查询的结果合并到现有查询中后,您可以将其作为
p.id
上的子查询进行
LEFT JOIN

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
  
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

不,我得到的日期是正确的,不是吗>=3月31日,我错过了+间隔1年…哇,那么..我如何将其与其他查询一起包含?将其插入您的sqlfiddle。它返回记录15,2013年3月28日。如果您希望日期介于明年4月1日和3月31日之间,为什么您希望结果为记录12?@dames,您如何将其包含在查询中还有什么问题吗?看起来好像我们在看两个不同的fiddle@dames,所以你试图将支付日期合并到该fiddle的查询中?