Скажем, у меня есть данные вроде этого
1 Red 2018-02-01
2 Red 2018-02-01
3 Red 2018-02-01
4 Blue 2018-02-01
5 Red 2018-02-02
5 Blue 2018-02-03
Я хочу получить общее количество в день за цвет, чтобы это было что-то вроде этого.
Select Count(Color) as count, color, myDate from colors
where color in ('red', 'blue')
group by myDate , color
Это должно заставить меня что-то вроде
3 red 2018-02-01
1 blue 2018-02-01
1 red 2018-02-02
1 blue 2018-02-03
Как я действительно хочу, это
3 red 2018-02-01
1 blue 2018-02-01
1 red 2018-02-02
0 blue 2018-02-02 <---- I want to know there was 0 blue on this day
1 blue 2018-02-03
0 red 2018-02-03 <----- I want to know there was 0 red on this day.
Есть ли простой способ вернуть этот результат? Мне всегда нужно видеть все, что находится in
разделе. Если бы я добавил что-то еще, мне нужно было бы увидеть 3 цвета в день.
редактировать
Надеюсь, это делает его более понятным
Таблица
Id (int) - Pk
UserId (int)
Activity (varchar(20))
dDate (datetime)
Данные
1 123 'Visited Home Page' 2018-02-23 05:15:14
2 123 'Visited Page 1' 2018-02-23 04:15:15
3 456 'Visited Home Page' 2018-02-23 04:15:16
4 456 'Visited Page 1' 2018-02-23 04:15:15
5 456 'Visited Page 1' 2018-02-24 04:15:15
ожидаемый результат
Count, Activity, dDate
2 'Visited Home Page' 2018-02-23
2 'Visited Page 1' 2018-02-23
1 'Visited Page 1' 2018-02-24
0 'Visited Home Page' 2018-02-24
SELECT Count(Activity) as Count, Activity, Date(dDate) as d FROM myTable
WHERE Activity IN('Visited Home Page', 'Visited Page 1') AND
DATE(dDateTime) BETWEEN '2018-01-01' AND '2018-01-31'
GROUP BY Date(dDate), Activity
Current Result
Count, Activity, dDate
2 'Visited Home Page' 2018-02-23
2 'Visited Page 1' 2018-02-23
1 'Visited Page 1' 2018-02-24
Поскольку ни один пользователь не попал на домашнюю страницу, ничего не было записано. Однако мне нужно всегда иметь результат для всего, что я вложил в свою статью.
если бы я добавил еще один "Visted Page 2", тогда результаты должны быть
Count, Activity, dDate
2 'Visited Home Page' 2018-02-23
2 'Visited Page 1' 2018-02-23
0 'Visited Page 2' 2018-02-23
1 'Visited Page 1' 2018-02-24
0 'Visited Home Page' 2018-02-24
0 'Visited Page 2' 2018-02-24
Если в тот день ничего не произошло, я, вероятно, смогу уйти, не верну никаких результатов. Хотя я хотел бы посмотреть, как это будет сделано.
вы можете просто оставить цвет, результат myDate с результатом подсчета, например:
select distinct a.color, a.myDate , ifnull(t.num_color,0)
from colors a
left join (
select color, myDate, count(*) num_color
from colors
group by color, myDate
) t on t.color= a.color AND t.myDate = a.myDate
например, для промежуточной оговорки вы могли бы
select distinct a.color, a.myDate , ifnull(t.num_color,0)
from colors a
left join (
select color, myDate, count(*) num_color
from colors
group by color, myDate
) t on t.color= a.color AND t.myDate = a.myDate
and date(a.myDate) between ( '2017-01-01') and ('2018-02-23')
и глядя на ваш обновленный образец вопроса
вы можете использовать подзаголовок со счетчиком для присоединения к отдельной деятельности и ddate
select distinct m.activity, date(m.dDate)
from my_table m
left join (
select activity, date(dDate), count(*) as my_count
from my_table
group by activity, date(dDate) as my_date
) t on t.activity = m.activity and date(m.dDate) = t.my_date
Если это нужно сделать только для двух цветов, самым простым способом является условная агрегация с union all
.
Select sum(Color='red') as count, 'red' as color, myDate
from colors
group by myDate
union all
Select sum(Color='blue') as count, 'blue' as color, myDate
from colors
group by myDate
Другой вариант - генерировать все цвета для каждой даты с помощью перекрестного соединения и подсчета.
Select count(t.color), c.color, d.myDate
from (select distinct color from colors) c
cross join (select distinct myDate from colors) d
left join colors t on t.color=c.color and t.myDate=d.myDate
group by c.color, d.myDate
Если все в порядке на одну строку, используйте условную агрегацию.
select sum(color='red') as red,sum(color='blue') as blue,myDate
from colors
group by myDate
Изменение: на основе обновления вопросника OP
select a.activity,d.dDate,count(t.dDate)
from (select distinct activity from t) a
cross join (select distinct date(dDate) as dDate from t) d
left join t on t.activity=a.activity and date(t.dDate)=d.dDate
and d.dDate >= '2018-02-01' and d.dDate < '2018-03-01'
group by a.activity,d.dDate