Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Сложный SQL запрос Group By, Count и Join вместе

Daniel Kiri Ученик (228), на голосовании 2 года назад
Даны 2 таблицы. Нужно найти процент использованного места в здании.
Мой вариант, он работает, но в запросе чего-то не хватает, чтобы он был правильным с точки зрения логики:

Select Distinct Building_Name, Count (Building) * 100 / Capacity
From Здание left Join Рабочие
On Рабочие.Building = Здание.Building_Name
group by Building_Name, Capacity;
Голосование за лучший ответ
Дед Мазай Гений (58137) 3 года назад
Запрос правильный.
Distinct не нужен, он ничего не меняет.
Параметр Count может быть любым кроме NULL.

Хороший стиль: давать таблицам псевдонимы. Например:
Select Building_Name, Count (Building) * 100 / Capacity
From Здание b left Join Рабочие w
On w.Building = b.Building_Name
group by Building_Name, Capacity
Daniel KiriУченик (228) 3 года назад
Мне вот так вот ответили: "Ты используешь столбец из другой таблицы, но как этот, так и предыдущий запрос работают, только если соблюсти логику group by." и я кажется понимаю суть. 1) произошло объединение таблиц 2) группировка по столбцу Building 3) счёт count 4) А на что он делится? В моём случае я делю на значение столбца Capacity и т. к. до группировки они все были одинаковыми, то я разделю на одно из нужных мне значений (при объединении таблиц всем сотрудникам значение Capacity было прописано одинаковое), то с ответом проблем не возникнет. Можно ли как-то обратиться к значению Capacity из ещё необъединённой таблицы по индексу по которому мы группировали?
Дед Мазай Гений (58137) Daniel Kiri, мне непонятно это объяснение. Такой запрос можно переписать так: select b.Building_Name, w.cnt * 100 / b.Capacity from Здание b left join ( select Building, count(*) cnt from Рабочие group by Building ) w on w.Building = b.Building_Name но надо ещё заменить w.cnt на 0, если там NULL. Суть в том, что группировка идёт только по таблице Рабочие, а записи из Здание не группируются. У тебя написано то же самое по сути.
Похожие вопросы