Возьмите подсчет на основе ярости даты SQL

0

У меня есть упомянутый sql-запрос ниже, который дает мне простой счет на эту дату, или если я использую where и and условие даты, оно дает мне консолидированный счет между датой.

select count(*) from A where date(date_1) = '2017-06-01';

Я хочу подсчитать количество дней для отдельного счета для каждой даты.

select count(*) from A where date(date_1) >= '2017-06-01' and date(date_1)<='2017-06-30';

Desired output:

Date          Count

2017-06-01    25
2017-06-02    20
2017-06-03    15
-             -
-             -
2017-06-30    10
  • 3
    Совет сегодня: GROUP BY .
  • 0
    Так верно, ярл :))
Теги:

3 ответа

1
Лучший ответ

Возможно, что-то вроде следующего:

SELECT DATE(date_1), COUNT(*)
FROM A
GROUP BY DATE(date_1)

COUNT, являясь агрегированной функцией, часто сочетается с предложением GROUP BY, чтобы получить агрегированные результаты для каждой группы (в данном случае - количество в день).

WHERE могут быть добавлены, по желанию, непосредственно перед предложением GROUP BY.

  • 0
    Даты, отсутствующие в таблице, будут отсутствовать в выходных данных.
  • 0
    Правда, но пока неясно, является ли это требованием.
2

Все, что вам нужно, это использовать предложение group by:

SELECT date(date_1),Count(*) as [Count]
FROM A
WHERE date(date_1) >= '2017-06-01' and date(date_1)<='2017-06-30'
GROUP BY date(date_1)
  • 0
    Это не будет указывать даты с отсутствующими данными.
  • 0
    Спасибо, отредактировал ответ.
Показать ещё 2 комментария
1

Следующее решение также сообщает дни без каких-либо инцидентов. Пример разработан в феврале:

    SELECT (DATE'2018-01-31' + INTERVAL x.n DAY) dd
         , COALESCE(sqt.c, 0)                    incidents
      FROM (select 1 n union all select 2 n union all select 3 n union all select 4 n union all select 5 n union all select 6 n union all select 7 n union all select 8 n union all select 9 n union all select 10 n union all select 11 n union all select 12 n union all select 13 n union all select 14 n union all select 15 n union all select 16 n union all select 17 n union all select 18 n union all select 19 n union all select 20 n union all select 21 n union all select 22 n union all select 23 n union all select 24 n union all select 25 n union all select 26 n union all select 27 n union all select 28 n) x
 LEFT JOIN (
                SELECT date1    d
                     , count(*) c
                  FROM t
              GROUP BY date1
           ) sqt
        ON sqt.d = (DATE'2018-01-31' + INTERVAL x.n DAY)
         ; 

Отдельную демонстрацию можно посмотреть здесь.

Генератор последовательности был бессовестно принят из этого SO-ответа.

Ещё вопросы

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