Всегда возвращать счет? Mysql

0

Скажем, у меня есть данные вроде этого

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

Если в тот день ничего не произошло, я, вероятно, смогу уйти, не верну никаких результатов. Хотя я хотел бы посмотреть, как это будет сделано.

  • 0
    Рассматривали ли вы вопрос об изменении логики приложения, чтобы пройти через указанные даты и получить нулевой счет, если для данного цвета / даты нет строки?
  • 0
    Мне просто интересно, как сложно было бы это сделать в sql.
Теги:

2 ответа

1
Лучший ответ

вы можете просто оставить цвет, результат 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
  • 0
    эй, у меня проблема с твоим кодом Я вижу, что у вас есть опечатка с t.nyDate, но даже когда я ее исправляю, я все равно получаю синтаксическую ошибку. Что-то с датой, когда убираю все хорошо.
  • 0
    ответ обновлен .. тип и ошибка .. удалено (пропущено и)
Показать ещё 8 комментариев
1

Если это нужно сделать только для двух цветов, самым простым способом является условная агрегация с 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
  • 1
    Это все равно не будет показывать нулевое число в датах, когда для данного цвета не существует строк.
  • 0
    @MichaelMior .. он обязательно покажет ноль.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню