У меня есть таблица как таковая:
date | page
----- |-----
2018-01-01 | good
2018-01-01 | good
2018-01-01 | good
2018-01-01 | bad
2018-01-02 | good
Как организовать по значениям в столбце страницы по дате как таковой:
date | good | bad
----- |------|----
2018-01-01 | 3 | 1
2018-01-02 | 1 | 0
Вам нужна условная агрегация:
select date,
sum(case when page = 'good' then 1 else 0 end) as good,
sum(case when page = 'bad' then 1 else 0 end) as bad
from table t
group by date;
Тем не менее, MySQL имеет сокращение для этого:
select date,
sum( page = 'good') as good,
sum( page = 'bad' ) as bad
from table t
group by date;
page
то вы можете просто написать sum()
иначе вам потребуется написать динамический сводный запрос для этого.
Это может просто добавить случай внутри функции sum:
select date,
sum( case when page = 'good' then 1 else 0 end) as good,
sum( case when page = 'bad' then 1 else 0 end ) as bad
from table t
group by date
Используя pivot
таблицу как,
create table #pivot(date date,page varchar(20))
insert into #pivot values
('2018-01-01','good')
,('2018-01-01','good')
,('2018-01-01','good')
,('2018-01-01','bad')
,('2018-01-02','good')
select date,good,bad from(
select date, page from #pivot
) f
pivot
( count(page) for page in (good,bad)
) p
Я не уверен, какую платформу вы используете, но если она в Oracle, это будет делать то же самое.
select date, sum(decode(page,'good',1,0)) as good, sum(decode(page,'bad',1,0)) as bad
from table t
group by date;
MySQL
,SQL Server
и т. Д.), Которую вы используете.