我想创建一个select查询,根据给定的列对行进行分组,然后按这些组的大小排序。
假设我们有这样的样本数据:
id type
1 c
2 b
3 b
4 a
5 c
6 b
我希望通过以下降方式对列“类型”进行分组和排序来获取以下:
id type
2 b
3 b
6 b
1 c
5 c
4 a
截至目前,我只能得到每个小组的数量,但这不是我需要的:
SELECT *, COUNT(type) AS typecount
FROM sampletable
GROUP BY type
ORDER BY typecount DESC, type ASC
id type count
2 b 3
1 c 2
4 a 1
有人可以帮我解决一下这个问题吗?
编辑: 使'b'成为最大的群体,避免仅使用SORT BY来实现相同的解决方案
答案 0 :(得分:3)
您无法在GROUP BY
中使用列别名;只需重复一下表达式:
SELECT type, COUNT(type) AS count
FROM sampletable
GROUP BY type
ORDER BY COUNT(*) DESC, type ASC
请注意,我更改了SELECT
子句 - 您无法在*
中使用SELECT
,因为SELECT
中的表达式需要位于GROUP BY
中3430X6906
子句或聚合。
答案 1 :(得分:1)
您无法在GROUP BY
上执行COLUMN ALIAS
操作。
为什么不能在SELECT语句的同一级别上创建的GROUP BY子句上使用ALIAS的原因是因为GROUP BY在创建ALIAS的SELECT子句之前执行。
这是SQL操作顺序:
尝试以下查询:
SELECT type, COUNT(type) AS count
FROM sampletable
GROUP BY type
ORDER BY COUNT(*) DESC, type ASC;
修改: - 强>
SELECT id, type
FROM sampletable
ORDER BY type DESC, id ASC;
答案 2 :(得分:1)
这可能不是最好的方式,但它会给你你想要的东西。
您计算出每个组的总数,然后加入"虚拟"根据确定的计数表到原始表格。
SELECT *
FROM sampletable s1
INNER JOIN (SELECT count(type) AS iCount,type
FROM sampletable
GROUP BY type) s2 ON s2.type = s1.type
ORDER BY s2.iCount DESC, s1.type ASC