按年份分组

x33g5p2x  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(329)

我正在尝试运行一个查询,该查询按日期字段对联系人进行分组,然后返回每个分组的计数。如果日期字段有一个空值是一个组,如果日期字段是10年前,那是另一个组,如果日期字段是3-10年前,那是第三个组,如果日期字段是<3年前,那就是最后一个组。
在此方面的任何帮助都将不胜感激。

rm5edbpk

rm5edbpk1#

您可以使用subselect来准备值,然后对它们进行分析和分组:

select case 
when elapsed is null then 'missing'
when elapsed <= 1095 then 'new'
when elapsed <= 3650 then 'middle'
else 'old'
end as period, count(*)
from
(select datediff(now(), yourdate) period from yourtable) t
group by period
ekqde3dh

ekqde3dh2#

http://sqlfiddle.com/#!9/86b630/2号

SELECT IF(my_date IS NULL, 'NO DATE', 
          IF(YEAR(NOW())-YEAR(my_date)>10,'>10', 
            IF(YEAR(NOW())-YEAR(my_date)>3,'3-10','<3')
          )
         ) `period`, COUNT(id)
FROM contacts
GROUP BY `period`
zengzsys

zengzsys3#

您需要在group子句中使用case语句:

SELECT  CASE 
            WHEN floor(DATEDIFF(EndDate, StartDate)/365) < 3 THEN '<3'
            WHEN floor(DATEDIFF(EndDate, StartDate)/365) < 10 THEN '3-10'
            WHEN floor(DATEDIFF(EndDate, StartDate)/365) = 10 THEN '=10'
            ELSE '>10' 
        END AS `Length`
FROM    ...
WHERE   ...
GROUP   BY  CASE 
                WHEN floor(DATEDIFF(EndDate, StartDate)/365) < 3 THEN '<3'
                WHEN floor(DATEDIFF(EndDate, StartDate)/365) < 10 THEN '3-10'
                WHEN floor(DATEDIFF(EndDate, StartDate)/365) = 10 THEN '=10'
                ELSE '>10' 
            END
ORDER   BY Length ASC;

如果你的结束日期是现在,就用 NOW() .

相关问题