2016-01-17 3 views
0

Мне нужна некоторая помощь в структурировании во времени запросов. Мне нужно несколько из них - но я думаю, что, если мне удастся показать, как это сделать, я могу понять других.Mysql во время запроса

Что я после: -Rolling 12-месячный просмотр «неактивных учетных записей» ... то есть количество учетных записей, которые не разместили заказ за 12 месяцев до этого. -Этот идеально будет подзапрос (в гораздо большей сценарий), соединяющую обратно на стол даты (см ниже)

January 2015 | # of customers with no orders from 1/2014-1/2015 
February 2015 | # of customers with no orders from 2/2014-2/2015 
March 2015 | # of customers with no orders from 3/2014-3/2015 
etc... 

Что у меня возникают проблемы обертывание мой взгляд вокруг, как я бы структурировать where, чтобы гарантировать, что он сканирует все заказы и возвращает всего идентификатора учетной записи, который не разместил заказ в течение года до этого месяца. Я использовал различные комбинации DATEDIFF, DATESUB и т.д.

SELECT DATE_FORMAT(order_datetime, '%Y-%m'), COUNT DISTINCT (account_id) 
FROM warehouse.orders 
JOIN warehouse.accounts ON xyz 
WHERE... 

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

Приветствия и спасибо заранее.

ответ

0

У меня недостаточно очков репутации, чтобы просто прокомментировать ваш вопрос. Однако я не совсем понимаю.

Используете ли вы SQLServer/TSQL или MySQL?

Вы хотите иметь только одну колонку, которая рассчитывает последние 12 месяцев скользящей средней или 12 столбцов для скользящей средней каждый месяц? Если это всего лишь одна цифра за последние 12 месяцев толлинга, вы хотите, чтобы это было с текущего дня или начала этого месяца?

Если это был SQL Server и прокатные 12 месяцев до сих пор, расчет может быть:

SELECT SUM(CASE WHEN DATEDIFF(y,GETDATE(),order_date_time) < 1 THEN COUNT(DISTINCT account_id) END) as January2015 

Если вы используете MySQL заменить GETDATE() с NOW()

Если вы хотите одно значение качению, но в начале месяца, то вы могли бы использовать:

SELECT SUM(CASE WHEN DATEDIFF(y,DATEADD(M, DATEDIFF(M, 0, GETDATE()), 0),order_date_time) < 1 THEN COUNT(DISTINCT account_id) END) as January2015 

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

+0

Благодарим за помощь. Я думал, что упоминал, что я использую MySQL, я думаю, нет. Виноват. Я ищу один столбец для объединения или сгруппировки в месяцы - в котором будет указано общее количество клиентов, которые не размещали в прошлом году.
Пример:
Январь 2015 | 1095
IE 1,095 наших клиентов не разместил заказ с января 2014 года до января 2015 года. Теперь должно быть другое предложение where, гарантирующее, что created_date не превышает указанный месяц (так как мы не могут рассчитывать клиентов, которых мы приобрели в 2016 году, так как не разместили заказ в 2015 году) –

+0

Нет, вы упомянули это в названии, но он был помечен как sqlserver. Я немного ближе к пониманию вашего требования - я был в милях от первого раза. Не могли бы вы просто пояснить - хотите ли вы сообщить, где не было заказов за 12 месяцев до любого месяца или только в текущем месяце? Если вам нужно сообщить количество учетных записей, которые не размещали заказ в течение предыдущего года в течение любого месяца, это немного сложнее, поскольку вам понадобится таблица календаря. Но оба пути, безусловно, возможны. – cb1210

+0

Я ищу 12-месячный обзор для прокатки 12 месяцев. (popfull ...) В основном у меня есть длинный скрипт с множеством различных мер, соединяющих таблицу дат через: 'WHERE DATE_FORMAT (d.created_date, '% Y-% m-% d') МЕЖДУ DATE_SUB (CURDATE(), INTERVAL 12 MONTH) И DATE_SUB (CURDATE(), INTERVAL 1 MONTH) ' Таким образом, поскольку параметры находятся вокруг curdate(), с месяца, в котором работает отчет, он предоставляет только результаты за 12 предыдущих полных месяцев. Для каждого из этих 12 полных месяцев мне нужно количество клиентов, которые не размещали заказ за год до этого месяца. –

0

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

select case 
when count(account_id)<0 then 'INACTIVE' 
when count(account_id)>0 then 'ACTIVE' 
from warehouse.orders 
where data_format(order_datetime, '%m/%Y') between '1/2014' and '1/2015' 
group by account_id) 
Смежные вопросы