как ссылаться на несколько столбцов в цепочке отношений 1: N - PullRequest
1 голос
/ 19 апреля 2011

Я все еще нахожусь в своей кривой обучения с 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)

Ответы [ 2 ]

0 голосов
/ 20 апреля 2011

В SQL Server 2005 +

SELECT
  CASE GROUPING(d.name)
    WHEN 1 THEN 'All:'
    ELSE d.name
  END AS dept,
  COUNT(*) AS total_manager,
  SUM(p.salary) AS wages
FROM dept d
  INNER JOIN office o ON d.id = o.dept_id
  INNER JOIN personnel p ON o.id = p.office_id
GROUP BY d.name WITH ROLLUP
0 голосов
/ 19 апреля 2011

Я думаю, что вы близко.При использовании SUM и COUNT вам иногда требуется выражение GROUP BY в вашем SQL, так что, возможно, вам этого не хватает.Что-то вроде:

SELECT  dept,
        COUNT(managers),
        sum(salary) wages
FROM personal
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'))
GROUP BY managers
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...