Группа по истекшим годам

0

Я пытаюсь запустить запрос, который группирует контакты по дате и затем возвращает количество для каждой группировки. Если поле даты имеет нулевое значение, которое является одной группой, если поле даты 10+ лет назад является другой группой, если поле даты 3-10 лет назад относится к третьей группе, и если поле даты < 3 года назад это окончательная группировка.

Любая помощь по этому вопросу будет принята с благодарностью.

  • 1
    Не могли бы вы добавить, на каком языке вы пишете этот запрос? (А также добавить его в качестве тега) Пример: mysql
Теги:
date-range
grouping

3 ответа

0

Вы можете использовать подзапрос, в котором вы готовите значения, а затем анализируете их и группируете их:

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
0

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

Вы должны использовать оператор CASE в предложении GROUP:

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().

Ещё вопросы

Сообщество Overcoder
Наверх
Меню