Мне нужно получить сводные данные из множества строк. Сводные поля подсчитывают, сколько записей имеют каждое значение для разных полей. Например, в таблице с указанием возраста, города, места работы и т. Д. Итоговые данные будут включать такие поля, как «countManager», «countCodeMonkey» для каждой вакансии, а затем «countChicago», «countNewYork» и т. Д. Для городов.
Я знаю, что простой способ получить все это:
select count(*) from table
group by age, city, job
Но это вертикальный счет - разные строки для каждого нужного мне значения. Вместо строк с числом я нуждаюсь в полях, потому что у меня есть другие поля для группировки, например, состояние. Поэтому я хочу, чтобы мои результаты выглядели так:
| State | countManager | countMonkey |
| IL | 3 | 25 |
| NY | 5 | 40 |
Я смотрю на два способа сделать это. У нас уже есть один реализованный, и выполнение занимает 20 минут. Мне интересно, будет ли другой путь быстрее.
Текущий способ выглядит так:
create view managers as
select state, count(*) as theCount from table
where job = 'Manager'
group by state;
create view monkeys as
select state, count(*) as theCount from table
where job = 'Monkey'
group by state;
select managers.theCount as managers, monkeys.theCount as monkeys
from managers left join monkeys
on managers.state = monkeys.state;
В реальном случае есть еще около 20 просмотров и, следовательно, еще 20 соединений.
Вместо этого я рассматриваю следующий метод горизонтального подсчета:
select state,
sum(case when job='Manager' then 1 else 0 end) as managers,
sum(case when job='Monkey' then 1 else 0 end) as monkeys
from table
group by state;
Это исключает объединения. Но я не имею ни малейшего представления о выполнении заявления "сумма дела". Будет ли это быстрее, примерно так же или намного медленнее? Нужно ли двигателю проходить по строкам несколько раз, по одному разу для каждого такого подсчитанного поля? Или он достаточно умен, чтобы считать все поля за один проход, проверяя каждое значение и увеличивая соответствующую сумму?
Я могу потратить часть дня на написание сценария для генерации огромного количества мусорных данных, чтобы проверить это, но я все же хотел бы знать, как ведет себя механизм db, которого я не смог найти в другом месте в Интернете.