给定列总和的行对/行三元组

时间:2016-04-13 13:02:39

标签: sql oracle

我想在给定某个值的SUM的情况下对行(或3,4等组)进行排序。

根据Name + Surname + Age

的串联,行是连续的

为了更好地理解下表:

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

正如你所看到的那样,名字+姓氏+年龄=“Rick Jams 22”的行位于顶部,因为它们的总和将是1305,其次是“Mike Brown 50”(总和= 220)和“John Smith 30” “(总和= 12)。 此外,结果表中的行数必须相同。

如何使用Oracle SQL执行此操作?

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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

查询使用SUM的窗口版本来计算每Name, Surname, Age分区的工资总和。我们可以在外部查询中使用此字段来进行排序。

答案 2 :(得分:1)

或试试这个

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