Я все еще нахожусь в своей кривой обучения с Grails, и я столкнулся со следующей проблемой:
class Departement {
String name // "hr", "it"...
static hasMany = [bureaus:Office]
}
class Office {
String bureaunumber // 102, 104, 106...
static hasMany = [ppl:Personnel]
}
class Personnel {
String name // "Smith", "Walker"...
String title // "project manager", "ceo", "financial manager"...
Integer salary
}
Цель состоит в том, чтобы найти сумму зарплаты для всех менеджеров в конкретном отделе.Результат должен содержать общую сумму зарплаты, общее количество менеджеров и название отдела примерно так:
|dept |total manager|wages |
|--------|-------------|--------|
| hr | 4 | 340000 |
| it | 7 | 610400 |
| ... | ... | ... |
| all | 11 | 950400 |
и т. Д.
Я хотел бы создать набор результатов сКритерии гибернации API, но я застрял с SQL-запросом, который даст результаты сверху.В настоящее время он дает мне правильную сумму зарплаты:
select sum(salary) wages
from personnel
where title LIKE '%manager%'
and office_id in
(
select office.id
from office
where office.dept_id in
(
select dept.id
from dept
where name = 'hr'
)
)
и хорошо - к сожалению, это все софар.У кого-нибудь есть идея, как подсчитать общее количество менеджеров для каждого отдела и как добавить название отдела в набор результатов?
Любой вклад будет очень признателен!
=========================
Привет, ребята, спасибо, что нашли время ответить на мой вопрос!
Янемного смущен подсчетом (менеджерами) части предложенного решения Бена, у меня нет поля менеджеров в классе домена персонала ... я что-то там пропускаю?
Пробовал с подсчетом (*), а также сcount (personal.name), но он дает мне общую зарплату в каждом отделе всех сотрудников, а также суммирует общее количество сотрудников, а не только тех, кто имеет должность менеджера: - /
поэтому результат после выполнения запроса выглядит следующим образом:
|dept |total manager|wages |
|--------|-------------|---------|
| hr | 139 | 3988800 |
| it | 139 | 3988800 |
| ... | 139 | 3988800 |
| all | 139 | 3988800 |
======== обновление 2: синтаксис sql server 2005+ для oracle ===========
SELECT
CASE GROUPING(d.name)
WHEN 1 THEN 'All:'
ELSE d.name
END dept,
COUNT(*) total_manager,
SUM(p.salary) wages
FROM departement d
INNER JOIN office o ON d.id = o.dept_id
INNER JOIN personnel p ON o.id = p.office_id
WHERE p.name LIKE '%manager%'
GROUP BY ROLLUP(d.name)