Подсчет в сводной таблице на основе периода дат - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь создать сводную таблицу для статуса бронирования столбца на ежемесячной основе

это моя таблица и запрос

select bkg.status,
       bkg.StartDate 
from tbl_booking bkg 
where bkg.StartDate between '2018-09-17' and '2018-10-17'  
order by bkg.StartDate

Я хочу быть в формате, подобном

Date Period     sep | Oct | Nov 

Status 1         10 | 20  |30
Status 2         40 | 50  |60

Я пробовал следующий запрос

SELECT bkg.StartDate ,bkg.status ,
count(if(bkg.StartDate between '2018-09-17' and '2018-10-17',bkg.status,0)) as 'sep',
count(if(bkg.StartDate between '2018-10-17' and '2018-11-17',bkg.status,0)) as 'Oct'
from tbl_booking bkg 
group by bkg.status

Но это дает мне результаты типа

enter image description here

ЕслиЯ удаляю Группу по, она дает результаты

, я также пытался

  SELECT bkg.status,
        count(CASE WHEN bkg.StartDate between '2018-09-17' and '2018-10-17' THEN bkg.status ELSE 0 END) AS 'sep',
        count(CASE WHEN bkg.StartDate between '2018-10-17' and '2018-11-17' THEN bkg.status ELSE 0 END) AS 'Oct'
    FROM tbl_booking bkg
GROUP BY bkg.status

Битовый результат, кажется, такой же.enter image description here

для даты между '2018-10-17' и '2018-11-17', нет записи, поэтому она должна вернуть 0, но это дает мневсе значения счетчиков одинаковы для всех месяцев.

, пожалуйста, предложите, что я могу изменить в моем запросе

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

count(if(bkg.StartDate between '2018-09-17' and '2018-10-17',bkg.status,0))

В приведенном выше коде, даже если ваше условие IF не выполняется, вы возвращаете 0 .Теперь COUNT(0 будет по-прежнему считать это как одну строку, следовательно, вы получите тот же счетчик строк.

Вам необходимо вернуть NULL, если условие ложно .Должно быть так:

count(if(bkg.StartDate between '2018-09-17' and '2018-10-17',bkg.status,NULL))

В случае сбоя условия строка не будет учитываться.

Ниже приведен пересмотренный общий запрос:

SELECT bkg.StartDate ,bkg.status ,
count(if(bkg.StartDate between '2018-09-17' and '2018-10-17',bkg.status,NULL)) as 'sep',
count(if(bkg.StartDate between '2018-10-17' and '2018-11-17',bkg.status,NULL)) as 'Oct'
from tbl_booking bkg 
group by bkg.status
0 голосов
/ 03 октября 2018

удаляет остальную часть, когда вы используете счетчик, поэтому, когда вы добавляете еще 0, он считает его, если вы используете сумму, тогда все в порядке, но для подсчета вы можете пропустить остальную часть, чтобы он рассматривал другое значение как ноль и давал вам точное значение.количество

SELECT bkg.status,
        count(CASE WHEN bkg.StartDate between '2018-09-17' and '2018-10-17' THEN bkg.status END) AS 'sep',
        count(CASE WHEN bkg.StartDate between '2018-10-17' and '2018-11-17' THEN bkg.status END) AS 'Oct'
    FROM tbl_booking bkg 
GROUP BY bkg.status
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...