当我尝试执行此查询时:
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子句中。
表连接在这里
答案 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
子句时,您只能使用聚合函数(MAX
,SUM
...)选择分组列或聚合非分组列。
在您的查询中,您需要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;
每位客户将返回一行,以及活动费用和活动数量。