在多列上使用group by

l--*_*''' 962 sql group-by

我明白了这一点 GROUP BY x

但是如何GROUP BY x, y工作,这是什么意思?

Sma*_*ery 1912

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
Run Code Online (Sandbox Code Playgroud)

group by仅在主题列上使用a 时; 说:

select Subject, Count(*)
from Subject_Selection
group by Subject
Run Code Online (Sandbox Code Playgroud)

你会得到类似的东西:

Subject    Count
------------------------------
ITB001     5
MKB114     2
Run Code Online (Sandbox Code Playgroud)

...因为ITB001有5个条目,MKB114有2个条目

如果我们是group by两列:

select Subject, Semester, Count(*)
from Subject_Selection
group by Subject, Semester
Run Code Online (Sandbox Code Playgroud)

我们会得到这个:

Subject    Semester   Count
------------------------------
ITB001     1          3
ITB001     2          2
MKB114     1          2
Run Code Online (Sandbox Code Playgroud)

这是因为,当我们按两列分组时,它会说"将它们分组以便所有具有相同主题和学期的人在同一组中,然后计算所有聚合函数(Count,Sum,Average等). )对于每个群体".在这个例子中,事实证明了这一点,当我们计算它们时,有个人在第一学期做ITB001,两个人在第二学期做这个.做MKB114的人都在第一学期,所以没有第二学期的行(没有数据适合"MKB114,第二学期"组)

希望这是有道理的.

  • 是的,它确实.我不能肯定他们是否和他们一样有效,但他们会给出相同的结果,是的. (17认同)
  • @Smashery:那么这也意味着`GROUP BY A,B`与`GROUP BY B,A`相同吗? (8认同)
  • 我想补充一点,按列分组的顺序无关紧要.在Semester的上述示例组中,Subject将给出相同的结果 (5认同)
  • 只是想说声谢谢。这个解释非常有帮助 (3认同)
  • 在这里可以补充说,"GROUP BY a,b"和"GROUP BY a AND b"之间存在差异,因为第二个仅列出具有完全相同内容且没有"undergroups"的分组项目.在这种情况下,输出将与第一个相同. (2认同)
  • 好吧,按a,b分组和按b分组,a不会返回相同的结果-行以不同的顺序显示 (2认同)
  • @fanny 就关系而言,结果是相同的,顺序在这里无关紧要。 (2认同)

S. *_*yol 28

GROUP BY子句与聚合函数结合使用,以按一列或多列对结果集进行分组.例如:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;
Run Code Online (Sandbox Code Playgroud)

记住这个顺序:

1)SELECT(用于从数据库中选择数据)

2)FROM(子句用于列出表)

3)WHERE(子句用于过滤记录)

4)GROUP BY(子句可以在SELECT语句中用于跨多个记录收集数据并按一列或多列对结果进行分组)

5)HAVING(子句与GROUP BY子句结合使用,将返回行组限制为条件为TRUE的那些行)

6)ORDER BY(关键字用于对结果集进行排序)

如果使用聚合函数,则可以使用所有这些,这是必须设置的顺序,否则可能会出错.

聚合函数是:

MIN返回给定列中的最小值

SUM返回给定列中数值的总和

AVG返回给定列的平均值

COUNT返回给定列中的值的总数

COUNT(*)返回表中的行数

  • 这甚至没有远程回答问题...这里的问题是如何同时实现“主题”和“学期”的“链式分组”,如给定示例中所解释的... (6认同)
  • 但是我们把 2 列放在哪里,如何基于 2/更多列进行聚合是问题 (3认同)