选择列表中的列“X”无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中

Posted

技术标签:

【中文标题】选择列表中的列“X”无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中【英文标题】:Column 'X' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause 【发布时间】:2021-06-02 23:55:48 【问题描述】:

得到以下错误:

列“FM8HO_FirmBoxContent.BoxIdentifier”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

已经尝试过其他的东西,你可以从我的代码中的 cmets 看到不知道如何解决这个问题。

如果有人也能解释这个问题,那么我也能理解,那也太棒了。

谢谢

DECLARE @TodaysDate DATE
SET @TodaysDate = '2021-06-01' 

SELECT 
DO.ObjectIdentifier AS BoxId,
--FBC.ContentType,
--FBC.Status AS DestroyStatus,
DO.ProcessedDateTimeStamp,
(SELECT COUNT(*) FROM FM8HO_FirmBoxContent
WHERE BoxIdentifier = DO.ObjectIdentifier) AS NumFilesInBox,
--(SELECT COUNT(DO1.ObjectIdentifier) FROM FM8HO_DestructionObjects AS DO1
--WHERE DO1.ObjectIdentifier = DO.ObjectIdentifier)
COUNT(DO.ObjectIdentifier) AS FilesMarkedForDestroyInBox,
--CASE WHEN (SELECT COUNT(*) FROM FM8HO_FirmBoxContent FBC.BoxIdentifier = COUNT(DO.ObjectIdentifier) THEN 'Yes' ELSE 'NO' END AS CanRetrieve
--CASE WHEN SELECT COUNT(*) FROM FirmBo WHERE FBC.BoxIdentifier = DO.ObjectIdentifier = COUNT(DO.ObjectIdentifier) THEN 'Yes' ELSE 'NO' END AS CanRetrieve
CASE WHEN (SELECT COUNT(*) FROM FM8HO_FirmBoxContent WHERE FBC.BoxIdentifier = DO.ObjectIdentifier) = COUNT(DO.ObjectIdentifier) THEN 'YES' ELSE 'NO' END
FROM FM8HO_DestructionObjects AS DO
LEFT JOIN FM8HO_FirmBoxes AS FB ON FB.BoxIdentifier = DO.ObjectIdentifier
LEFT JOIN FM8HO_ArchiveBoxes AS AB ON AB.BoxIdentifier = DO.ObjectIdentifier
LEFT JOIN FM8HO_FirmBoxContent AS FBC ON FBC.BoxIdentifier = DO.ObjectIdentifier
WHERE CONVERT(DATE , DO.ProcessedDateTimeStamp) = @TodaysDate AND FBC.Status = 'Destroyed' --AND FBC.Status = 'Destroyed' AND 
GROUP BY DO.ObjectIdentifier, FBC.ContentType, FBC.Status, DO.ProcessedDateTimeStamp

【问题讨论】:

错误信息很清楚。您正在使用 SELECT 中子查询的相关子句中的列,并且它没有被聚合。你想要完成的事情还不清楚。样本数据、期望的结果和清晰的解释会有所帮助。您也许还可以简化示例。我怀疑是否需要六张表来说明这个问题。 当您将“GROUP BY”添加到 SELECT 语句时,用作输出结果(来自查询的主“SELECT”部分)或用作 WHERE 子句的一部分(或,在大多数情况下,作为“JOIN”列)必须是“GROUP BY”中包含的列之一,或者必须以某种方式聚合。为您的 RDBMS 描述“GROUP BY”的参考文档(在您的情况下是 SQL Server)确实是开始了解使用 GROUP BY 背后的基本规则的最佳场所。 docs.microsoft.com/en-us/sql/t-sql/queries/… 这能回答你的问题吗? Column "invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause" 相关:CONVERT(DATE , DO.ProcessedDateTimeStamp)既然你用这个,我就给你指点这个might not be efficient discussion 【参考方案1】:

在发布的代码中,嵌套的 SELECT 语句创建相关的子查询。因为子查询中的列既不在聚合函数中,也不在 GROUP BY 子句中,因此会引发错误。计算 NumFilesInBox 列的一种方法是使用 OUTER APPLY。你可以试试这样的

SELECT DO.ObjectIdentifier AS BoxId,
       FBC.ContentType,
       FBC.[Status] AS DestroyStatus,
       DO.ProcessedDateTimeStamp,
       isnull(fbc.NumFilesInBox, 0) AS NumFilesInBox,
       COUNT(DO.ObjectIdentifier) AS FilesMarkedForDestroyInBox,
       CASE WHEN isnull(fbc.NumFilesInBox, 0) = COUNT(DO.ObjectIdentifier) THEN 'Yes' ELSE 'NO' END AS CanRetrieve
FROM FM8HO_DestructionObjects AS DO
     LEFT JOIN FM8HO_FirmBoxContent AS FBC ON FBC.BoxIdentifier = DO.ObjectIdentifier
     outer apply (SELECT COUNT(*) FROM FM8HO_FirmBoxContent fbc WHERE fbc.BoxIdentifier = DO.ObjectIdentifier) AS fbc(NumFilesInBox)
WHERE CONVERT(DATE , DO.ProcessedDateTimeStamp) = @TodaysDate 
      AND FBC.Status = 'Destroyed' 
GROUP BY DO.ObjectIdentifier, FBC.ContentType, FBC.[Status], DO.ProcessedDateTimeStamp;

【讨论】:

【参考方案2】:

您是否尝试过 window 子句而不是 group by ? 这不会将您限制在选定的列上 正如 cmets 提到的,我们需要更多细节,最好是简化示例

【讨论】:

【参考方案3】:

通过在 GROUP BY 中添加一列解决了这个问题

【讨论】:

请输入您的工作查询。将来会对其他人有所帮助。另外,将您的答案标记为已接受的答案。【参考方案4】:

如果有一个像 (name, state ..) 这样的列名,该名称中可能有一个方法/函数,您可能会收到此错误。就我而言,就是这样。所以要将该列带入查询中,您可以使用这样的子查询:

select 
    (select count(*) from secinccaeb) as GrandTotal, 
    count(a.evtye) as PartialTotal, 
    (select name from hlsyslistitem 
     where listitemid = c.listitemid) as EventType 
from 
    secinccaeb as a
inner join 
    hlsyslistitem as c on c.listitemid = a.evtye
group by 
    c.listitemid

【讨论】:

以上是关于选择列表中的列“X”无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中的主要内容,如果未能解决你的问题,请参考以下文章

SQL:选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 子句中[关闭]

选择列表中的列无效

列“在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中”]]

如何解决这个无效的选择列表?

选择列表中的列无效,因为该列没有包含在聚合函数或 GROUP BY 子句中

选择列表中的列……无效,因为该列没有包含在聚合函数或 GROUP BY 子句中