【问题标题】:Order table by the total count but do not lose the order by names按总计数排序表但不丢失按名称排序
【发布时间】:2021-12-11 00:31:20
【问题描述】:

我有一个表,由 3 列(人、年和计数)组成,因此对于每个人,有几行具有不同的年份和计数,最后一行具有总计数。我想保持表格按名称排序,但也按总数排序。

所以行应该按总和排序,但也应该按人分组并按年份排序。当我试图按总和排序时,当然,人和年份都搞砸了。有没有办法这样排序?

【问题讨论】:

  • 错误的数据模型,您没有在同一列中存储不同类型的数据(年份和文本)。计算几年的总和是可以在需要时在 SQL 中完成的,但您不会将其存储在数据库中。这也解决了您的问题,以及您尚未遇到的许多问题。

标签: sql


【解决方案1】:

您也存储了这些“总”行吗?天哪!你为什么这样做?


无论如何:如果你

  • 计算year 列等于'total'
  • 的行进行排名
  • case 表达式添加到order by 子句中,

你可能会得到你想要的:

SQL> with sorter as
  2    (select name, cnt,
  3       rank() over (order by cnt) rnk
  4     from test
  5     where year = 'total'
  6    )
  7  select t.*
  8  from test t join sorter s on s.name = t.name
  9  order by s.rnk, case when year = 'total' then '9'
 10                       else year
 11                  end;

NAME YEAR         CNT
---- ----- ----------
John 2018           3
John 2019           2
John total          5
Bob  2017           2
Bob  2019           4
Bob  total          6

6 rows selected.

SQL>

【讨论】:

  • 感谢您的回复,但是,我的意思是在决赛桌中,我也需要将它们按总数排序,例如在您的示例中,第一个将是约翰,因为他的总数较小
  • 啊哈,这就是你的意思……好吧,我想我明白了。编辑了答案;请看一下。
  • 当您将年份存储为字符串时,9 会在所有 2017、2018、2021、... 年份之后排序,因此每个名称的 TOTAL 行排在最后。跨度>
  • 哦,我明白了,谢谢
  • 我可以再问1个问题,我已经按照你说的做了,但是在2个人的总数相同的情况下,他们的排名相同,结果是混合的打印时。有没有办法克服这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多