Как сгруппировать по количеству дней разницы в SQL-запросе?

#mysql #sql #group-by #count #sum

Вопрос:

У меня есть окончательное соединение в моем запросе, которое объединяет 2 таблицы t1 и t2,

 select count(t1.customerID) as count, DATEDIFF(day,t2.action_date,min(t1.ordered_date)) as diff_date 
inner join t2
on t1.EMAIL = t2.EMAIL and t1.CATEGORY_ID = t2.CATEGORY_ID  
inner join product on prod.CATEGORY_ID= t1.CATEGORY_ID
where t2.action_date <= t1.ordered_date
group by t2.action_date,t1.CATEGORY_ID
 

И я получаю результаты, как показано ниже

 Count    diff_date
100        0
222        0
300        0
20         1
40         1
 

Чего я хочу, так это получить что-то вроде этого

 Count      difff_date
622          0
60           1
and so on...
 

Я не уверен, как получить такие результаты?
Может ли кто-нибудь помочь?

Комментарии:

1. Рассмотрите возможность использования другого имени поля вместо count . Это ключевое слово SQL, и в любом языке программирования рекомендуется использовать его только по назначению.

2. Вы уверены, что используете MySQL? Код, похоже, SQL Server.

Ответ №1:

Вам нужен другой уровень агрегации:

 SELECT SUM(count) count, diff_date
FROM (
  SELECT COUNT(t1.customerID) count, DATEDIFF(day, t2.action_date, min(t1.ordered_date)) diff_date 
  FROM t1
  INNER JOIN t2 ON t1.EMAIL = t2.EMAIL AND t1.CATEGORY_ID = t2.CATEGORY_ID  
  INNER JOIN product p ON p.CATEGORY_ID = t1.CATEGORY_ID
  WHERE t2.action_date <= t1.ordered_date
  GROUP BY t2.action_date, t1.CATEGORY_ID
) t
GROUP BY diff_date;
 

Или используйте SUM() функцию окна:

 SELECT DISTINCT 
       SUM(COUNT(t1.customerID)) OVER (PARTITION BY DATEDIFF(day, t2.action_date, min(t1.ordered_date))) count, 
       DATEDIFF(day, t2.action_date, min(t1.ordered_date)) diff_date 
FROM t1
INNER JOIN t2 ON t1.EMAIL = t2.EMAIL and t1.CATEGORY_ID = t2.CATEGORY_ID  
INNER JOIN product p ON p.CATEGORY_ID = t1.CATEGORY_ID
WHERE t2.action_date <= t1.ordered_date
GROUP BY t2.action_date, t1.CATEGORY_ID;