查询SQL服务器 - "不包含在聚合函数或GROUP BY子句中#34;

时间:2015-10-20 10:51:12

标签: sql sql-server sql-server-2008

当我尝试执行此查询时:

SELECT 
    EventNo, Customer.CustNo, CustName,EstCost,
    SUM(EstCost) AS TotalEstCost, COUNT(*)
FROM 
    EventRequest 
INNER JOIN 
    Customer ON EventRequest.CustNo = Customer.CustNo
WHERE 
    Status = 'Approved'
GROUP BY 
    Customer.CustNo;

我收到此错误:

  

专栏' EventRequest.EventNo'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

表连接在这里

enter image description here

4 个答案:

答案 0 :(得分:4)

您需要GROUP BY未包含在聚合函数中的所有字段..

SELECT EventNo, c.CustNo, CustName, EstCost, SUM(EstCost) AS TotalEstCost, COUNT(*) 
FROM EventRequest er
INNER JOIN Customer c ON er.CustNo = c.CustNo 
WHERE Status = 'Approved' 
GROUP BY c.CustNo, EventNo, CustName, EstCost

或者使用子查询选择它们。

SELECT (SELECT ers.EventNo 
        FROM EventRequest ers 
        WHERE er.EventNo = ers.EventNo and ers.CustNo = c.CustNo) AS EventNo, 
        c.CustNo, 
       (SELECT cs.CustName 
        FROM Customer cs 
        WHERE c.CustName = cs.CustName AND c.CustNo = cs.CustNo) AS CustName, 
       (SELECT ers2.EstCost 
        FROM EventRequest ers2 
        WHERE er.EventNo = ers2.EventNo and ers2.CustNo = c.CustNo) AS EstCost, 
        SUM(EstCost) AS TotalEstCost, 
        COUNT(*) 
FROM EventRequest er
INNER JOIN Customer c ON er.CustNo = c.CustNo 
WHERE Status = 'Approved' 
GROUP BY c.CustNo

答案 1 :(得分:2)

使用GROUP BY子句时,您只能使用聚合函数(MAXSUM ...)选择分组列或聚合非分组列。

在您的查询中,您需要Customer.CustNo,但您尝试选择导致错误的EventNo(和其他人)。

您需要考虑此专栏,因为选择它是没有意义的。如果您按客户进行灌浆,结果集将为每个客户提供一行(如果您想汇总一些此类客户数据,例如成本,这很有意义),但您希望如何输出?单行中有多个EventNo个值?你可能根本不想想要它。同样适用于EstCost(不是总数)。

对于有意义的其他字段(例如CustName),您可以将它们添加到GROUP BY子句中,然后直接选择它们。< / p>

将您的查询更改为:

SELECT Customer.CustNo, CustName, SUM(EstCost) AS TotalEstCost, COUNT(*)
FROM EventRequest INNER JOIN Customer ON
  EventRequest.CustNo = Customer.CustNo
WHERE Status = 'Approved'
GROUP BY Customer.CustNo, CustName;

答案 2 :(得分:1)

您必须将 SELECT 语句中的所有字段添加到 GROUP BY ,之后您将获得预期的结果。 例如:

SELECT EventNo, Customer.CustNo, CustName,EstCost, SUM(EstCost) AS TotalEstCost, COUNT(*) 
FROM EventRequest 
    INNER JOIN Customer ON EventRequest.CustNo = Customer.CustNo 
WHERE Status = 'Approved' 
GROUP BY EventNo, Customer.CustNo, CustName,EstCost;

答案 3 :(得分:0)

我怀疑您需要客户而不是事件。因此,删除SELECT中描述事件的无关列:

SELECT c.CustNo, c.CustName, SUM(EstCost) AS TotalEstCost, COUNT(*)
FROM EventRequest er INNER JOIN
     Customer c
     ON er.CustNo = c.CustN
 WHERE Status = 'Approved'
GROUP BY c.CustNo, c.CustName;

每位客户将返回一行,以及活动费用和活动数量。