1

我有一个人表,可以同时容纳人和他的经理。
我正在使用 SELF JOIN 来选择经理的电子邮件,但我收到了很多重复的邮件。

http://imageshack.us/photo/my-images/3/withoutgroupby.png

如何在查询中使用 GROUP BY

SELECT              P.prs_id AS 'Employee_id', M.prs_id AS 'Manager_id', M.prs_email AS 'Manager_email'
FROM                qrd_prs_person AS P
LEFT OUTER JOIN     qrd_prs_person AS M  
ON                  P.prs_manager_number = M.prs_number

按 M.prs_id 分组

如果我在查询末尾添加此行以按 Manager_id 分组,我会收到此错误

列 'qrd_prs_person.prs_id' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

4

5 回答 5

3

我不太确定你想要达到什么目的?

如果您的查询返回每位员工一行,其中包含经理信息的两个可选列,那么您的原始查询是正确的(没有分组依据)。这种关系是多对一的,您从每个“多”的一行开始,每个“多”都有一个(可选)“一”,因此无需分组。

然而,这是假设您的数据是正确的,并且 prs_number 实际上对于每个员工都是唯一的。如果您有两个或多个经理共享一个 prs_number,那么您最终将拥有多个经理。

通过将其作为外部联接,您还可以在没有经理的情况下返回人员(即食物链的顶端:)),这是您的意图吗?

编辑

如果您只想返回经理,那么您不能保留第一列 (P.prs_id) 并为每个经理获取一行。如果您想要管理一个或多个人员的人员列表,这将起到作用:

SELECT              M.prs_id AS 'Manager_id', M.prs_email AS 'Manager_email'
FROM                qrd_prs_person AS P
INNER JOIN          qrd_prs_person AS M  
ON                  P.prs_manager_number = M.prs_number
GROUP BY            M.prs_id, M.prs_email
于 2011-10-05T11:48:25.173 回答
2

你为什么要分组,因为我没有看到 Min、Max、Sum 或任何需要分组的东西?也许一个order by就足够了?无论如何,如果你GROUP BY,任何不是 SUMmed 或 MINed 等的列都必须出现在 GROUP BY 子句中。

于 2011-10-05T11:28:17.620 回答
0

您在 select 语句中的所有列都需要分组,或者它们需要具有聚合函数,您可以尝试添加 MAX(qrd_prs_person.prs_id) 并查看它是否有效。应该帮助你:-)

此外,您需要逐个添加电子邮件 ID 部分,否则使用 MAX() 您的查询应该是

SELECT  MAX(P.prs_id) AS 'Employee_id', 
        M.prs_id AS 'Manager_id', 
        M.prs_email AS 'Manager_email'
FROM                
    qrd_prs_person AS P
    LEFT OUTER JOIN     
        qrd_prs_person AS M  ONP.prs_manager_number = M.prs_number
GROUP BY 
    M.prs_id, M.prs_email
于 2011-10-05T11:28:24.907 回答
0

如果您使用的是 MySQL,它只会从组中获取 M.prs_id 值之一。但是这些值在组内可能不同,因此仅随机选择其中一个并没有意义。这就是 SQL Server 抱怨的原因。

我认为您只是误解了 GROUP BY 的工作原理。你到底想用这个查询来实现什么?

于 2011-10-05T11:29:34.610 回答
0

问题是,当您执行 a 时,突然间您对select 子句中group by的内容有许多可能的答案。P.prs_id AS 'Employee_id'(一个经理的每个员工。)SQL Sever 想确切地知道你想去那里,所以它坚持你提供某种方法来将所有的值加起来为一个值。

可能您想要计算员工数量,因此只需将其替换为COUNT(P.prs_id) AS 'Employee_count'.

您还需要添加M.prs_email到您的 group by 子句。

于 2011-10-05T11:34:10.957 回答