【问题标题】:Order pairs/triplets of rows given the sum of a column给定一列的总和,订单对/三组行
【发布时间】:2016-08-04 14:23:23
【问题描述】:

在给定特定值的总和的情况下,我想订购成对(或 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

您可以看到 Name+Surname+Age = "Rick Jams 22" 的行位于顶部,因为它们的总和为 1305,然后是 "Mike Brown 50" (sum = 220) 和 "John Smith 30" "(总和 = 12)。 此外,结果表中的行数必须相同。

如何使用 Oracle SQL 做到这一点?

感谢您的帮助

【问题讨论】:

  • 存储年龄通常是个坏主意,因为每一天都是某人的生日——数据可能会失效。
  • @jarlh:也许是他们晋升到那个薪水的年龄。
  • 您好,这些行表示具有不同 id 但相同姓名+姓氏+年龄的重复项。目标是了解哪些是与最高薪水相关的重复项。

标签: sql oracle


【解决方案1】:
SELECT  t.*,
        COALESCE(SUM(salary) OVER (PARTITION BY name, surname, age), 0) ss
FROM    mytable t
ORDER BY
        ss DESC

【讨论】:

  • 你还需要在分区中添加年龄
  • 这似乎可行,谢谢!但是,我首先得到所有以 0 作为 Salary 的结果(并且新的通讯员“ss”列是空的)。我怎样才能改变它,让那些在桌子的底部?我尝试使用 'COALESCE(SUM(salary),0) OVER (PARTITION BY name, surname, age) ss' 但我收到以下错误:“语句 1 无效。ORA-00923: FROM 关键字未在预期的地方找到"
【解决方案2】:

试试这个:

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 分区的工资总和。我们可以在外部查询中使用该字段进行排序。

【讨论】:

  • 不需要子查询。
【解决方案3】:

或者试试这个

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多