Группировка по дням, но один результат установлен для часов до 16:00 и один для часов после 16:00.

Я снова застрял! Я получил следующий запрос, чтобы выбрать результирующий набор клиентов и некоторые даты.

SELECT
    COUNT( DISTINCT CASE `saved` WHEN 0 THEN `cust` ELSE NULL END ) AS test,
    COUNT( DISTINCT CASE `saved` WHEN 1 THEN `cust` ELSE NULL END ) AS test2,
    DATE( `date` ) AS dateday
FROM `salg_test`
WHERE `is_void` = 0
GROUP BY dateday
ORDER BY dateday DESC

Это можно рассматривать как итог. Теперь я хотел бы разделить этот запрос на основе следующего условия: час меньше 16:00 или больше 16:00. Я использую PHPmyadmin, поле даты имеет формат current_timestamp, 24-часовой формат. Проблема в том, что мне все еще нужно, чтобы он был сгруппирован по ДАТЕ, а не по текущей_временной метке. Если возможно, я хотел бы превзойти свой SQL-запрос, а не использовать PHP, хотя я повторяю запрос в таблице с помощью цикла while. Какие-нибудь советы?

Большое спасибо за Вашу помощь!


person Martine Sivertsen Nilsen    schedule 24.06.2016    source источник
comment
phpmyadmin не является базой данных. это инструмент управления сервером базы данных mysql. это все равно, что сказать, что вы используете руль для вождения автомобиля.   -  person Marc B    schedule 25.06.2016
comment
и group by тоже может иметь произвольное выражение. group by hour(datedate) < 16   -  person Marc B    schedule 25.06.2016


Ответы (2)


Пробовали ли вы добавить другой элемент в свой запрос выбора в соответствии с приведенным ниже утверждением?

IF(DATE_FORMAT(dateday, '%H') < 16,0,1) AS afterfourpm

Оператор должен получить час в 24-часовом формате в столбце dateday и выдать результат 0, если он меньше 16, и 1, если он больше 16.

Тогда вы, возможно, сможете отсортировать по этому значению? Без базы данных это сложно проверить, но это будет выглядеть примерно так:

SELECT COUNT( DISTINCT
CASE `saved`
WHEN 0
THEN `cust`
ELSE NULL
END ) AS test, COUNT( DISTINCT
CASE `saved`
WHEN 1
THEN `cust`
ELSE NULL
END ) AS winback, DATE( `date` ) AS test1,
IF(DATE_FORMAT(dateday, '%H') < 16,0,1) AS afterfourpm
FROM `salg_test`
WHERE `is_void` =0
GROUP BY dateday
ORDER BY dateday DESC, afterfourpm DESC

Я надеюсь, что в этом есть смысл.

person d3v_1    schedule 24.06.2016
comment
Спасибо за вашу помощь! До сих пор не понял, думаю, утром мне нужно пересмотреть свой код с ясной головой :) обновлю, когда решу проблему. - person Martine Sivertsen Nilsen; 25.06.2016

Вы должны написать еще один оператор case в SQL, по которому вы группируете.

Например:

Case when timestamp <= 16:00 then 'Y' else 'N' end as time_flag

Сгруппируйте это также, и это должно дать вам результат, который вы хотите.

person Jeff    schedule 24.06.2016