2016-04-13 28 views
4

我想按給定值的總和對行(或3,4組等)排列行數。給定列的總和的行/列的排列對數/列數

該行基於名稱+姓+時代的串聯是連續

爲了更好地理解如下表:

ID Name Surname Age Salary 
------------------------------ 
1 John Smith 30 2 
2 John Smith 30 10 
3 Rick James 22 300 
4 Rick James 22 1000 
5 Rick James 22 5 
6 Mike Brown 50 200 
7 Mike Brown 50 20 

我想有應下令決賽桌DESC的每個姓名+姓氏+年齡的薪水總和,並保持行相同的名稱+姓氏+年齡彼此相鄰,儘管ID列是不同的。這將是預期的結果:

ID Name Surname Age Salary 
------------------------------ 
3 Rick James 22 300 
4 Rick James 22 1000 
5 Rick James 22 5 
6 Mike Brown 50 200 
7 Mike Brown 50 20 
1 John Smith 30 2 
2 John Smith 30 10 

正如你可以看到名+姓+年齡=「裏克卡紙22」是頂部的行,因爲他們的總金額將是1305,其次是「麥克·布朗50 「(總和= 220)和」約翰史密斯30「(總和= 12)。 此外,結果表中的行數必須相同。

如何使用Oracle SQL做到這一點?

感謝所有幫助

+3

貯藏年齡通常是一個壞主意,因爲每一天都是一個人的生日 - 和數據可能會變得無效。 – jarlh

+0

@jarlh:也許這是他們被提升到那個年薪的年齡。 – Quassnoi

+0

嗨,這些行表明重複的具有不同的id,但名稱+姓氏+年齡相同。目標是瞭解哪些是與最高工資相關的重複項。 – Sik

回答

2
SELECT t.*, 
     COALESCE(SUM(salary) OVER (PARTITION BY name, surname, age), 0) ss 
FROM mytable t 
ORDER BY 
     ss DESC 
+1

你需要添加年齡以及在分區 – Madhivanan

+0

這似乎工作,謝謝! 但是,我首先獲得了所有0作爲薪水(和新的通訊員「ss」列爲空)的結果。我怎樣才能改變這種情況,讓那些在桌子底部?我試着用'COALESCE(SUM(salary),0)OVER(PARTITION BY name,surname,age)ss' 但我得到以下錯誤: 「Statement 1 is valid。ORA-00923:FROM keyword not found預期的地方「 – Sik

1

試試這個:

SELECT ID, Name, Surname, Age, Salary 
FROM (
    SELECT ID, Name, Surname, Age, Salary, 
     SUM(Salary) OVER (PARTITION BY Name, Surname, Age) AS sum_of_sal 
    FROM mytable) t 
ORDER BY sum_of_sal DESC, ID 

查詢,以計算每Name, Surname, Age分區工資的總和使用的SUM窗口版本。我們可以在外部查詢中使用此字段進行排序。

+0

不需要子查詢。 – sagi

1

或試試這個

SELECT ID, Name, Surname, Age, Salary   
    FROM mytable 
    ORDER BY SUM(Salary) OVER (PARTITION BY Name, Surname, Age) DESC, ID