【问题标题】:ORDER BY without Total in SQLSQL 中没有总计的 ORDER BY
【发布时间】:2018-10-26 07:45:07
【问题描述】:

我有这个 SQL 查询,它使用 ROLLUP 来获取总数,但还需要每隔一行按金额排序:

SELECT 
    ISNULL([SharepointId], 'Total') as 'Sharepoint', 
    Count([Id]) as 'Nombre de tickets' 
FROM [dbo].[Tickets]
GROUP BY ROLLUP([SharepointId])
ORDER BY 2 DESC, 1

有没有办法确保总数保持在结果的末尾,同时保持其他行的降序?

目前,这是我得到的:

Sharepoint         Nombre de tickets
------------------ -----------------
Total              20326
INTERNE            9396
MAIN               1503
...

【问题讨论】:

  • 如果你把order by子句改成升序,那么你肯定会保证总排在最后,除非所有票数都为零:ORDER BY 2 ASC, 1
  • @PeterAbolins 要是能这么简单,我就得按降序排列。
  • ORDER BY GROUPING([SharepointId]), COUNT([id]) DESC : docs.microsoft.com/en-us/sql/t-sql/functions/…

标签: sql sql-server group-by sql-order-by rollup


【解决方案1】:

其他答案不符合您的要求。

  • 你不希望一行是最后一行,因为它是 NULL
  • 您希望将一行放在最后,因为它已被分组


SQL Server 正好有一个功能,文档页面中几乎完全有你的示例......


SELECT 
    ISNULL([SharepointId], 'Total') as 'Sharepoint', 
    Count([Id]) as 'Nombre de tickets' 
FROM [dbo].[Tickets]
GROUP BY ROLLUP([SharepointId])
ORDER BY GROUPING([SharepointId]), 2 DESC

GROUPING([SharepointId])0 当列 分组(所以这些行首先排序) 然后它是 1 当列 分组(因此该行排在最后)。这在汇总多列时特别有用。

【讨论】:

  • 谢谢!我知道有一种更清洁的方法可以做到这一点。
【解决方案2】:

试试这个

SELECT 
    ISNULL([SharepointId], 'Total') as [Sharepoint], 
    Count([Id]) as [Nombre de tickets]
FROM [dbo].[Tickets]
GROUP BY ROLLUP([SharepointId])
ORDER BY CASE WHEN [SharepointId] IS NULL THEN 'B' ELSE 'A' END, [Nombre de tickets] DESC

【讨论】:

  • 我不能仅仅添加另一个无意义的列,因为结果需要是人类可读的。
  • 那不会运行,我不认为ISNULL可以那样使用。
  • 这只是打字错误。添加了一个空格使其为空
  • 谢谢!最终将两个答案与ORDER BY CASE WHEN [SharepointId] IS NOT NULL THEN Count([Id]) END DESC, 1 合并
  • 很高兴为您提供帮助 ;)
【解决方案3】:

修改 Order By 子句如下:

CASE WHEN  ISNULL([SharepointId], 'Total') <>'Total' THEN  
Count([Id])END DESC, 1

【讨论】:

    【解决方案4】:

    简单使用case表达式:

    order by (case when SharepointId is null then 1 else 0 end), [Nombre de tickets] desc;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多