在选择列表中获取“列无效”,因为它未包含在聚合函数或Group By子句中。

13 浏览
0 Comments

在选择列表中获取“列无效”,因为它未包含在聚合函数或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)

0
0 Comments

这个问题的出现原因是在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"这个问题。

0
0 Comments

这个问题的原因是在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,从而解决了原始问题。

希望这个解决方法对你有帮助!

0