2014-11-13 65 views
0

我將在查詢中使用三個表:

兩級分組在SQL查詢

部門:
DepartmentID的 - PK
DepartmentName的


收益:
EarningID - PK
PersonID
EarningValue


人:
是PersonID - PK
DepartmentID的

名稱

我需要做一個查詢,將返回4列:
- DepartmentName的
- 人的姓
- 個人收入總和
- 部門的所有收入總和

我正在閱讀有關ROLLUP,CUBE和GROUPING SETS子句,但我沒有想法如何在此處使用它。 一個重要的事情是,

+0

你正在使用什麼sql server版本? – sqlhdv

+0

我使用oracle 12c –

+0

我有查詢選擇我需要的一切,但兩個總和值是在一列而不是兩個。臨時我展示部門和人員的ID。 SELECT DepartmentID,People.PersonID,SUM(EarningValue)AS SumEarnings FROM People JOIN Earnings ON People.PersonID = Earnings.PersonID GROUP BY GROUPING SETS(DepartmentID,People.PersonID); –

回答

0

我覺得這樣的事情會做的伎倆我不能使用OVER(PARTITION。(假設SQL Server)的

基本上,你總結起來分開,並在那之後它們連接起來。

SELECT 
    DepartmentName, 
    PersonEarningValue, 
    Surname, 
    PersonEarningValue 
FROM 
    (SELECT 
     Departments.DepartmentID, 
     Departments.DepartmentName, 
     SUM(Earnings.EarningValue) as DeparmentEarningValue 
    FROM Departments 
    JOIN People ON Departments.DepartmentID = People.DepartmentID 
    JOIN Earnings ON People.PersonID = Earnings.PersonID 
    GROUP BY Departments.DepartmentID, Departments.DepartmentName) as DepartmentSums 
LEFT JOIN 
    (SELECT 
     DepartmentID, 
     Surname, 
     SUM(EarningValue) as PersonEarningValue 
    FROM People ON Departments.DepartmentID = People.DepartmentID 
    JOIN Earnings ON People.PersonID = Earnings.PersonID 
    GROUP BY DepartmentID, Surname) as PeopleSums 
ON DepartmentSums.DepartmentID = PeopleSums.DepartmentID 
1

我在DB2上工作,但我剛剛看了一下,在一個Oracle手動,它看起來非常接近DB2在這方面,這個查詢應該讓你很接近終點線,但它暴露3個結果列,其中Sum_Earnings表示所有部門的部門總數,人員總數或總計s,具體取決於總和記錄類型(GROUPING函數用於確定您正在處理的總行的哪個級別)。如果你真的需要它(提示:分組功能),只需稍作調整,你就可以把它變成暴露4個結果列。

select decode(grouping(D.DepartmentName), 1, 'All Departments', D.DepartmentName) 
      as Department 
     ,decode(grouping(P.Surname), 1, 'All Persons', P.Surname) as Person_Surname 
     ,sum(E.EarningValue) as Sum_Earnings 

from  Departments D 
join  People  P 
    on P.DepartmentID = D.DepartmentID 
join  Earnings E 
    on E.PersonID = P.PersonID 

group by rollup(D.DepartmentName, P.Surname) 
order by grouping(D.DepartmentName), Department, grouping(P.Surname), Person_Surname 

因爲CUBE,ROLLUP和GROUPING SETS可以用代碼體積小得多執行這些任務,他們真的去因爲有少做一個編碼錯誤(一旦你換你的頭的機會的方式如果你正在製作這樣的總結報告,通過允許數據庫執行所有的總結工作,你可能會獲得更好的性能(與將詳細信息行讀入計算總計的程序相反)攪動細節行 - 唉)。

它通常需要我幾個試圖獲得行排序和這些類型的查詢總標籤正確,因爲我不經常這樣做(很少在近幾年的報道工作),所以希望我沒有軟管那個。

0

我正在嘗試發佈解決方案和許多我的想法。我有四列正確的金額,但我有部門和身份證件的身份證件,涉及部門名稱和姓氏。 我如何更改查詢來替換這兩列?

SELECT DepartmentID, PersonID, SUM(EarningValue), PersonSum FROM People 
JOIN Earnings USING(PersonID) 
JOIN 
(
SELECT DepartmentID, SUM(EarningValue) AS DepartmentSum FROM People 
JOIN Earnings USING(PersonID) 
GROUP BY DepartmentID 
) USING (DepartmentID) 
GROUP BY DepartmentID, PersonID, DepartmentSum 
ORDER BY DepartmentID