2013-02-18 176 views
0

新SQL'er在这里。好的一个学校作业我决定在问题中构建表格,以便我可以测试我的查询是否正确。SQL查询失败

其中一个问题是简单地显示共享同一办公室的所有员工。易我觉得

SELECT office, name 
FROM my_db.employee 
GROUP BY office; 

但是当我运行这一点,只返回每一个独特的办公室并不是所有的办公室分组的第一个元组。

我的逻辑有问题吗?

回答

0

SELECT部分​​中的所有内容必须出现在GROUP BY部分中,聚合字段除外。也就是说,您正在选择“办公室,名称”,但只能通过“办公室”进行分组。你需要按“办公室,名称”进行分组。

1

您可以仅选择在group by语句,或者使用聚合函数列(求和,计数等)

所以,

select office, count(name) from my_db.employee group by office; 

会的工作,但它不是什么你当然想要。

你可能想那样简单

select office, name from my_db.employee order by office 

这将让他们的办公室“分组”的东西。 GROUP BY要求SQL只为每个GROUP BY变量发出一行 - 这不是“分组”,因为您的任务提出了这个意思,我认为。

+0

完美,感谢您对GROUP BY查询的解释! – 2013-02-18 16:50:27

0

由于您可以直观地检查行以查看谁在办公室,或者使用MySQL以外的语言非常简单地进行聚合,所以您收到的问题对于如何呈现数据有点不清楚。也许他想要这样的事情?

SELECT 
    office, GROUP_CONCAT(name) 
FROM 
    my_db.employee 
GROUP BY 
    office 
+0

非常感谢所有的回应。伟大的董事会获得帮助。我现在看到为什么GROUP BY没有做我认为应该做的事情。 – 2013-02-18 16:49:14

1

作为一个新手到SQL,你需要学会区分上被问什么......

我想谁的办公室“X”(工作的所有的人使用WHERE子句 - 您对此感兴趣的办公室='X')

我想知道为每个办公室工作的多少(使用GROUP BY子句,并包含所有“分组依据”字段)。

Group By与您想共同执行的某些列上的聚合相关联。经销商有多少辆汽车销售。每辆车每月销售多少辆汽车?

当进行聚合时,这些通常与MIN(),MAX(),SUM(),AVG()等相关联,并且许多引擎中的group需要您列出所有非聚合字段以进行分组。

Explosion Pills'的答案可能与您想要的最接近,并且是非数字或可比较的集合函数(例如min(),max())的例外。 Group_Concat()告诉引擎只要依次构建一个字符串列表,只要它们都处于相同的“组”分类(例如您的Office)范例中即可。

祝你的教育好运,并且在这里有很多人可以帮忙。

+0

感谢您的详细解释!我有一种感觉,我一定是错误地使用了GROUP BY。很高兴能够清楚地阐明它。回到阅读我的课堂笔记! – 2013-02-18 16:51:34