SQL按组大小

时间:2016-05-03 00:13:43

标签: sql

我想创建一个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来实现相同的解决方案

3 个答案:

答案 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 BY3430X6906子句或聚合。

答案 1 :(得分:1)

您无法在GROUP BY上执行COLUMN ALIAS操作。

为什么不能在SELECT语句的同一级别上创建的GROUP BY子句上使用ALIAS的原因是因为GROUP BY在创建ALIAS的SELECT子句之前执行。

这是SQL操作顺序:

  1. FROM clause
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING条款
  5. SELECT条款
  6. ORDER BY子句
  7. 尝试以下查询:

    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

http://sqlfiddle.com/#!9/f6b0c4/6/0