You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

主查询关联SystemUser的子查询报错,能否如此使用该关联?

SQL子查询关联主表字段报错问题解决

原SQL语句

SELECT 
SU.FullName as Salesperson,
COUNT(DS.new_dealsheetid) as Units,
SUM(SO.New_profits_sales_totaldealprofit) as TDP,
SUM(SO.New_profits_sales_totaldealprofit) / COUNT(DS.new_dealsheetid) as PPU,

-- opportunities subquery
(SELECT COUNT(*) FROM Opportunity O
LEFT JOIN Account A ON O.AccountId = A.AccountId
WHERE A.OwnerId = SU.SystemUserId AND
YEAR(O.CreatedOn) = 2022)
-- /opportunities subquery

FROM New_dealsheet DS
LEFT JOIN SalesOrder SO ON DS.New_DSheetId = SO.SalesOrderId
LEFT JOIN New_salespeople SP ON DS.New_SalespersonId = SP.New_salespeopleId
LEFT JOIN SystemUser SU ON SP.New_SystemUserId = SU.SystemUserId
WHERE 
YEAR(SO.New_purchaseordersenddate) = 2022 AND
SP.New_SalesGroupIdName = 'LO'
GROUP BY SU.FullName

报错信息

列'SystemUser.SystemUserId'在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。

问题解答

可以通过这种方式关联主表字段,但当前报错的核心原因是:GROUP BY仅指定了SU.FullName,而子查询中引用的SU.SystemUserId既不在GROUP BY列表里,也没有被聚合函数包裹。SQL语法要求,SELECT列表中的非聚合字段必须全部包含在GROUP BY中,或者能被GROUP BY的字段唯一确定。

解决方法一:扩展GROUP BY字段

直接把SU.SystemUserId加入GROUP BY列表。由于SystemUserId是用户表的主键,每个FullName对应唯一的SystemUserId,因此不会改变分组逻辑:

SELECT 
SU.FullName as Salesperson,
COUNT(DS.new_dealsheetid) as Units,
SUM(SO.New_profits_sales_totaldealprofit) as TDP,
SUM(SO.New_profits_sales_totaldealprofit) / COUNT(DS.new_dealsheetid) as PPU,
(SELECT COUNT(*) FROM Opportunity O
LEFT JOIN Account A ON O.AccountId = A.AccountId
WHERE A.OwnerId = SU.SystemUserId AND
YEAR(O.CreatedOn) = 2022) AS OpportunityCount

FROM New_dealsheet DS
LEFT JOIN SalesOrder SO ON DS.New_DSheetId = SO.SalesOrderId
LEFT JOIN New_salespeople SP ON DS.New_SalespersonId = SP.New_salespeopleId
LEFT JOIN SystemUser SU ON SP.New_SystemUserId = SU.SystemUserId
WHERE 
YEAR(SO.New_purchaseordersenddate) = 2022 AND
SP.New_SalesGroupIdName = 'LO'
GROUP BY SU.FullName, SU.SystemUserId

解决方法二:改用JOIN+预聚合替代子查询

将子查询的聚合逻辑提前完成,再通过JOIN关联到主查询,这种方式在数据量较大时性能更优:

SELECT 
SU.FullName as Salesperson,
COUNT(DS.new_dealsheetid) as Units,
SUM(SO.New_profits_sales_totaldealprofit) as TDP,
SUM(SO.New_profits_sales_totaldealprofit) / COUNT(DS.new_dealsheetid) as PPU,
COALESCE(OppCount.TotalOpportunities, 0) AS OpportunityCount
FROM New_dealsheet DS
LEFT JOIN SalesOrder SO ON DS.New_DSheetId = SO.SalesOrderId
LEFT JOIN New_salespeople SP ON DS.New_SalespersonId = SP.New_salespeopleId
LEFT JOIN SystemUser SU ON SP.New_SystemUserId = SU.SystemUserId
LEFT JOIN (
    SELECT A.OwnerId, COUNT(*) AS TotalOpportunities
    FROM Opportunity O
    LEFT JOIN Account A ON O.AccountId = A.AccountId
    WHERE YEAR(O.CreatedOn) = 2022
    GROUP BY A.OwnerId
) OppCount ON OppCount.OwnerId = SU.SystemUserId
WHERE 
YEAR(SO.New_purchaseordersenddate) = 2022 AND
SP.New_SalesGroupIdName = 'LO'
GROUP BY SU.FullName, SU.SystemUserId, OppCount.TotalOpportunities

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:15:27