sql - 如何按具有特定列值的行数进行排序

标签 sql sql-server-2012 sql-order-by

我有一个 SQL select 语句如下:

select * from editortemp order by case 
when CategoryID = 10 then 0 
else CategoryID end,
Ranking

我想更改结果的顺序,这样除了将所有 CategoryID = 10 的行放在顶部之外,行的 REST 将根据每个 CategoryID 的行数排序,在降序。

当我尝试做的时候

select * from editortemp order by case 
when CategoryID = 10 then 0 
else count(CategoryID) end,
Ranking

我收到错误消息:“editortemp.EditorTempID”列在选择列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中。

网上查了下这个错误,好像是select语句的逻辑有问题。

我如何创建一个逻辑选择语句来按照我上面描述的那样对行进行排序?

编辑:当我尝试运行以下语句时:

 select * from editortemp order by case 
    when CategoryID = 10 then 0 
    else (select count(CategoryID) from editortemp) end,
    Ranking

我没有收到上述错误,但排序不正确。它将所有 category=10 行放在顶部,但随后开始根据排名排序,而不是根据 categoryid 的计数...有什么想法需要更改才能获得我想要的结果吗?

非常感谢您的帮助!

最佳答案

您确实应该展示您的表的示例结构、一些示例数据以及您在原始帖子中所期望的示例。

从外观上看,您的 editortemp 表有多个记录,并且可能有更多数据元素显然没有在此处显示。我会先得到一个预先汇总的计数,然后加入以作为您订购的一部分。有点像

select 
      et.* 
   from 
      editortemp
         JOIN ( select categoryID, count(*) as CatCount
                   from editortmp
                   group by categoryID ) preAgg
            on et.categoryID = preAgg.categoryID
   order by 
      case when CategoryID = 10 then 1 else 2 end,
      preAgg.CatCount desc,
      ranking

case/when 将首先强制初步排序 categoryID = 10,然后是其他任何内容。 order by 的次要部分是来自连接到的预聚合表的计数。因此,即使类别 10 有 3 个条目而类别 2 有 100 个条目,类别 10 仍然位于第一个位置......只有这样,其余部分才会按计数降序排列。

根据反馈...

我不知道排名是什么,但只有在给定类别计数有多个条目时,排名才会产生影响。

What if categories 1, 2, 3, 4, 5 all have a count of 73 entries... and 
cat 1 has a ranks of 6, 12, 15...
cat 2 has ranks of 3, 20, 40...
cat 3 has ranks of 9, 10, 18... 
they will be intermingled.  

如果你想把所有相同的类别分组,那么会在排名之前添加,比如

   order by 
      case when CategoryID = 10 then 1 else 2 end,
      preAgg.CatCount desc,
      CategoryID,
      ranking

这样,如果多个类别的数量为 73,则上述排序依据将按排名排列所有类别 1,然后排列类别 2,依此类推。

关于sql - 如何按具有特定列值的行数进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27523983/

相关文章:

sql查询-分组然后加入

mysql - 在给定登机和下机时间的情况下查找每小时载客量

mysql - 当列不为空时,使用 SQL 从图库表中选择图像

sql-server - 如何高效规范导入数据?

sql-server - 使用过滤统计的情况

oracle - 10g 在前面包含数字时对 varchar 列进行排序

sql - 从左连接到第一个表的第二个表中获取最新记录

sql - 在 SQL 中,我需要生成一个排名(第一、第二、第三)列,卡在 "ties"上

mysql - `ORDER BY` 和 `LIMIT` 与 `JOIN` 组合

mysql - 如何同时选择 ORDER BY 列和 RAND()?