在选择列表中获取“列无效”,因为它未包含在聚合函数或Group By子句中。
在选择列表中获取“列无效”,因为它未包含在聚合函数或Group By子句中。
当我通过DataDirect ODBC驱动程序运行以下代码时,它抛出了以下错误:“在选择列表中,列'dbo.LD.LaborCode'无效,因为它既不包含在聚合函数中,也不包含在Group By子句中。” 这段时间以来一直运行良好,但现在开始出现此错误。
SELECT LaborCode, SUM(RegHrs + OvtHrs) AS Hours FROM dbo.LD WHERE (WBS1 IN ('0851.190791.20')) AND (TransDate BETWEEN '1/1/1901' AND '3/27/2019') GROUP BY LEFT(LaborCode, LEN(LaborCode) - 1)
这个问题的出现原因是在SELECT语句中的列没有包含在聚合函数或GROUP BY子句中。解决方法是要么将该列添加到聚合函数中,要么将其包含在GROUP BY子句中。
第一个示例中,SELECT语句中的LaborCode列没有被包含在聚合函数或GROUP BY子句中。要解决这个问题,可以将LaborCode列添加到GROUP BY子句中,或者将SUM函数应用到LaborCode列上,如下所示:
SELECT LaborCode, SUM(RegHrs + OvtHrs) AS Hours FROM dbo.LD WHERE (WBS1 IN ('0851.190791.20')) AND (TransDate BETWEEN '1/1/1901' AND '3/27/2019') GROUP BY LaborCode
第二个示例中,使用了LEFT函数对LaborCode列进行了处理,并将其包含在GROUP BY子句中。但是,SELECT语句中的左侧处理后的LaborCode列也没有被包含在聚合函数或GROUP BY子句中。要解决这个问题,可以将LEFT(LaborCode, LEN(LaborCode) - 1)列添加到GROUP BY子句中,或者将SUM函数应用到LEFT(LaborCode, LEN(LaborCode) - 1)列上,如下所示:
SELECT LEFT(LaborCode, LEN(LaborCode) - 1) LaborCode, SUM(RegHrs + OvtHrs) AS Hours FROM dbo.LD WHERE (WBS1 IN ('0851.190791.20')) AND (TransDate BETWEEN '1/1/1901' AND '3/27/2019') GROUP BY LEFT(LaborCode, LEN(LaborCode) - 1)
通过将相关列添加到聚合函数或GROUP BY子句中,可以解决"Getting Column Invalid in select list because not contained in an aggregate function or Group By"这个问题。
这个问题的原因是在SELECT语句中使用了一个不包含在聚合函数或GROUP BY子句中的列。解决方法是在SELECT语句中重复使用相同的表达式。
在上面的代码示例中,原始的SELECT语句是这样的:
SELECT LEFT(LaborCode, LEN(LaborCode) - 1) AS LaborCode,
SUM(RegHrs + OvtHrs) AS [Hours]
FROM dbo.LD
WHERE WBS1 IN ('0851.190791.20') AND TransDate BETWEEN '1901-01-01' AND '2019-03-27'
GROUP BY LEFT(LaborCode, LEN(LaborCode) - 1);
这个SELECT语句中的LaborCode列包含了一个表达式,但在GROUP BY子句中没有重复使用这个表达式。为了解决这个问题,可以将表达式再次重复使用,如下所示:
SELECT L.LaborCode, SUM(RegHrs + OvtHrs) AS [Hours]
FROM dbo.LD CROSS APPLY
( VALUES (LEFT(LaborCode, LEN(LaborCode) - 1))
) L(LaborCode)
WHERE WBS1 IN ('0851.190791.20') AND TransDate BETWEEN '1901-01-01' AND '2019-03-27'
GROUP BY L.LaborCode;
在这个解决方法中,使用了APPLY子句来重复使用表达式。通过将表达式放在CROSS APPLY子句中的VALUES子句中,并将其命名为L.LaborCode,然后在SELECT语句和GROUP BY子句中使用L.LaborCode,从而解决了原始问题。
希望这个解决方法对你有帮助!