GROUP BY x
的要点。但是
GROUP BY x, y
的工作原理是什么?#1 楼
Group By X
表示将X值相同的所有元素归为一组。Group By X, Y
表示将X和Y值相同的所有元素归为一组。为了举例说明,让我们说我们有下表,与谁在大学里修读什么科目有关:
Table: Subject_Selection
+---------+----------+----------+
| Subject | Semester | Attendee |
+---------+----------+----------+
| ITB001 | 1 | John |
| ITB001 | 1 | Bob |
| ITB001 | 1 | Mickey |
| ITB001 | 2 | Jenny |
| ITB001 | 2 | James |
| MKB114 | 1 | John |
| MKB114 | 1 | Erica |
+---------+----------+----------+
仅在主题列上使用
group by
时;例如:select Subject, Count(*)
from Subject_Selection
group by Subject
您会得到类似的东西:
+---------+-------+
| Subject | Count |
+---------+-------+
| ITB001 | 5 |
| MKB114 | 2 |
+---------+-------+
...因为ITB001有5个条目,MKB114有2个条目
如果我们要
group by
两列:select Subject, Semester, Count(*)
from Subject_Selection
group by Subject, Semester
我们会得到:
+---------+----------+-------+
| Subject | Semester | Count |
+---------+----------+-------+
| ITB001 | 1 | 3 |
| ITB001 | 2 | 2 |
| MKB114 | 1 | 2 |
+---------+----------+-------+
这是因为,当我们将两列分组时,是说“将它们分组,以便所有具有同一科目和学期在同一组中,然后为每个组计算所有聚合函数(计数,总和,平均值等)”。在此示例中,以下事实证明了这一点:当我们对他们进行计数时,有三个人在第1学期做ITB001,有两个人在第2学期做这件事。两个做MKB114的人都在第1学期,所以没有第2学期的行(没有数据适合“ MKB114,第2学期”组)
这很有意义。
评论
@Smashery:那么这是否也意味着GROUP BY A,B与GROUP BY B,A相同?
–tumchaaditya
2014年9月26日在18:08
是的,它确实。我不能肯定地说它们是否彼此一样有效,但是它们会给出相同的结果,是的。
–粉碎
2014年9月29日,0:10
可能需要补充的是,GROUP BY a,b和GROUP BY a AND b之间是有区别的,因为第二个仅列出内容完全相同的分组项目,而没有“ undergroups”。在这种情况下,输出将与第一个相同。
– Dwza
2015年3月4日15:06
我想补充一点,您按列分组的顺序无关紧要。在以上按学期分组的示例中,主题将给出相同的结果
–user2441441
2015年9月29日在21:07
好吧,按a,b分组和按b分组,a不会返回相同的结果-行以不同的顺序显示
–范妮
18-10-3在9:14
#2 楼
GROUP BY
子句与聚合函数结合使用,以将结果集按一列或多列分组。例如:SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
记住此顺序:
SELECT(用于从数据库中选择数据)
FROM(子句用于列出表)
WHERE(子句用于过滤记录)
GROUP BY(子句可用于SELECT语句中以收集多个记录中的数据,并将结果按一个或多个列分组)
HAVING(子句与GROUP结合使用BY子句
将返回的行的组限制为条件
为TRUE的那些行
ORDER BY(关键字用于对结果集进行排序) )
如果使用聚合函数,则可以使用所有这些,这是必须设置它们的顺序,否则会出现错误。
汇总函数为:
MIN返回给定列中的最小值
SUM返回给定列中数值的总和
AVG返回给定列的平均值
COUNT返回给定列中值的总数
有关以下内容的SQL脚本示例使用汇总函数:
假设我们需要查找总销售额大于950美元的销售订单。我们结合使用
HAVING
子句和GROUP BY
子句来完成此操作:SELECT
orderId, SUM(unitPrice * qty) Total
FROM
OrderDetails
GROUP BY orderId
HAVING Total > 950;
计算所有订单并将其分组为customerID,然后对结果进行排序。我们将
COUNT
函数与GROUP BY
,ORDER BY
子句和ASC
结合在一起:SELECT
customerId, COUNT(*)
FROM
Orders
GROUP BY customerId
ORDER BY COUNT(*) ASC;
将
AVG
函数与GROUP BY
和HAVING
子句结合使用,检索平均单价大于10美元的类别:SELECT
categoryName, AVG(unitPrice)
FROM
Products p
INNER JOIN
Categories c ON c.categoryId = p.categoryId
GROUP BY categoryName
HAVING AVG(unitPrice) > 10;
使用子查询中的
MIN
函数按类别获取价格较便宜的产品:SELECT categoryId,
productId,
productName,
unitPrice
FROM Products p1
WHERE unitPrice = (
SELECT MIN(unitPrice)
FROM Products p2
WHERE p2.categoryId = p1.categoryId)
评论
但是我们要将2列放在哪里,如何基于2 /更多列进行汇总是一个问题
–柴坦尼亚·巴帕特
17年11月17日在22:13
嗨,Chaitanya,我不知道这是否是您要问的,但让我给您举几个例子。如果您有产品表,则可以通过这种方式使用聚合函数,以下是两种情况:从产品中选择AVG(库存);这将计算产品表中库存的平均单位。现在,您要按产品类别计算库存单位,必须将AVG函数与GROUP BY子句一起使用,如下所示:SELECT categoryId,AVG(instock)FROM products GROUP BY categoryId;
– S. Mayol
17年11月22日在18:25
这甚至不能远程回答问题。这里的问题是如何同时实现“主题”和“学期”的“链式分组”,如给定示例中所述。
–MahNas92
19年5月20日在10:22
评论
您将找不到该问题所描述的内容。 GROUP BY子句可以接受一个或多个字段。按客户分组; GROUP BY姓,名;按年份,商店,SKU等分组