我了解GROUP BY x的要点。
但是GROUP BY x, y的工作原理是什么?

评论

您将找不到该问题所描述的内容。 GROUP BY子句可以接受一个或多个字段。按客户分组; GROUP BY姓,名;按年份,商店,SKU等分组

#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 BYORDER BY子句和ASC结合在一起:
SELECT 
    customerId, COUNT(*)
FROM
    Orders
GROUP BY customerId
ORDER BY COUNT(*) ASC;

AVG函数与GROUP BYHAVING子句结合使用,检索平均单价大于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