2011-04-19 45 views
1

我仍然在我使用Grails的學習曲線,我已經碰到了下面的問題:如何引用多個列的1:N關係鏈

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' 
    ) 
) 

以及 - 不幸的是,這一切都是沙箱。有沒有人知道如何計算每個部門的總經理人數以及如何將部門名稱添加到結果集中?

任何輸入將不勝感激!

=========================

嗨,大家好, 感謝您抽出寶貴的時間回答我的問題!

我對Ben的建議解決方案(管理員)部分感到有點困惑,我在人員領域類中沒有管理員字段......我錯過了那裏的東西嗎?

試着用count(*)和count(personnel.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) 

回答

0

在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

就是這樣。我只需要它根據Oracle更改語法,它就像一個魅力一樣工作 - 非常感謝您的幫助! – sphere 2011-04-20 09:40:03

0

我覺得你很接近。當使用SUM和COUNT時,你有時需要在你的SQL中有一個GROUP BY子句,所以也許這就是你所缺乏的。喜歡的東西:在

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 
+0

-1 「有時」'當使用SUM和COUNT,有時需要一個GROUP BY子句中的SQL'。你**總是**需要它,如果你想要可預見的結果。另外,當您不彙總「部門」但是您彙總「管理人員」時,按「管理員」進行分組可能會產生問題。 – JNK 2011-04-19 14:34:02

+1

你並不總是**需要一個'sum by'或'count'這樣的'group by'子句。只有當你選擇一個不是聚合的表達式。在Oracle中,'雙精度計數(*)是完全有效的SQL。 – 2011-04-19 14:54:39

+0

正確的亞當,它是有時。例如--- SELECT COUNT(*)FROM tablename --- works並且沒有「GROUP BY子句。 – Ben 2011-04-19 15:50:35