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

Помощь с запросом MySQL

NoName NoLastName Ученик (91), на голосовании 4 года назад
Задание такое: Число сотрудников подразделения, принятых на работу (Hiredate) в январе 2009 г.
Таблица Emp содержит такие поля: Empno, Ename, Job, Mgr, Hiredate, Sal, Comm, Deptno
Всего есть 3 департамента.

Я пытался сделать так: SELECT COUNT(`Deptno`) FROM `Emp` WHERE YEAR(`Hiredate`)="2009" and MONTH(`Hiredate`)="01" and `Deptno` IN (SELECT DISTINCT `Deptno` FROM `Emp`)
Но результат, не тот который нужен. Я использовал под запрос, с целью сделать проход по каждому департаменту и расчет количества, но это не срабатывает и он считает один раз неверное число, в чем может быть проблема? Надеюсь на вашу помощь!
Дополнен 4 года назад
Таблица ниже
Голосование за лучший ответ
Дед Мазай Гений (58137) 4 года назад
Это условие
`Deptno` IN (SELECT DISTINCT `Deptno` FROM `Emp`)
всегда верно и поэтому не имеет смысла.
И как оно должно работать? Структура таблицы мне неизвестна. Может надо считать количество различных значений в поле Empno?
NoName NoLastNameУченик (91) 4 года назад
Мне нужно запросом по каждому Deptno сосчитать количество людей, принятых на работу в январе 2009. В Deptno есть подразделения 10,20,30 нужно по каждому отдельную строчку с количеством таких людей.
Дед Мазай Гений (58137) Значит должна быть группировка. Читай про GROUP BY
NoName NoLastNameУченик (91) 4 года назад
А можно как-то без GROUP BY обойтись? Я собираюсь этот запрос сделать подзапросом в большом запросе. В подзапросе нельзя GROUP BY делать..
Пытаюсь сделать в этом ключе:
SELECT `Deptno` AS "Номер подразделения", COUNT(`Deptno`) AS "Общее число сотрудников", (SELECT COUNT(`Deptno`) FROM `Emp` WHERE YEAR(`Hiredate`)="2009")AS "Принят", SUM(`Sal`) AS "Оклад" FROM `Emp` GROUP BY `Deptno`
Но подсчет идет не по каждому подразделению, как задумано, а по всем сразу..
Дед Мазай Гений (58137) Я не понял, зачем нужен подзапрос. Какой смысл столбца "принят"?
NoName NoLastNameУченик (91) 4 года назад
Вместо 4,4,4 должно быть 0,1,3
NoName NoLastNameУченик (91) 4 года назад
"принят" - число сотрудников, принятых на работу в январе 2009
Дед Мазай Гений (58137) Оклад общий?
NoName NoLastNameУченик (91) 4 года назад
если без подзапроса, то результат всегда будет выводить в двух столбцах "Общее число сотрудников" и "Принят" 1 и 3, так как запрос выполнится только на тех, что был принят в январе 2009. Мне же нужно так, чтобы было просто число сотрудников для каждого подразделения в столбце "Общее число сотрудников" и число тех, кто как раз с января 2009 в столбце "Принят"
NoName NoLastNameУченик (91) 4 года назад
Оклад всех сотрудников определенного отдела
Дед МазайГений (58137) 4 года назад
Вложенный запрос не нужен. Чтоб вычислить агрегатную функцию не для всех строк, пиши так:
count(case when условие then значение end)
Когда условие не соблюдается case вернёт null, и count не посчитает это значение. Аналогично для других агрегатных функций.
С вложенными запросами тоже можно, но писанины будет больше.
NoName NoLastNameУченик (91) 4 года назад
сейчас попробую
NoName NoLastNameУченик (91) 4 года назад
Получилось!!! Большое спасибо !!!
Сделал так:
SELECT `Deptno` AS "Номер подразделения", COUNT(`Deptno`) AS "Общее число сотрудников", COUNT(CASE WHEN YEAR(`Hiredate`)=2009 THEN 1 END)AS "Принят", SUM(`Sal`) AS "Оклад" FROM `Emp` GROUP BY `Deptno`
Сейчас попробую процентный оклад..
Дед Мазай Гений (58137) Да, так. Только должно быть ещё условие на месяц.
Похожие вопросы