我有一个 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/