GROUP By子句中的TSQL错误

时间:2011-10-26 16:46:40

标签: sql sql-server sql-server-2005 tsql sql-server-2008

我对填充的Table变量有以下查询,该变量应该返回行或每个最近的日期:

SELECT t.ID
    ,t.Column_2
    ,t.MaxDate AS [End Date Time]
    ,t.Column_3
    ,t.Column_4
    ,t.Column_5
FROM (
    SELECT ID
        ,Column_2
        ,MAX(EndDateTime) AS MaxDate
        ,Column_3
        ,Column_4
        ,Column_5
    FROM @MyTable
    GROUP BY Column_2
    ) t
INNER JOIN @MyTable o ON t.ID = o.ID
    AND t.MaxDate = o.EndDateTime

我一直收到错误:Column '@MyTable.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.不确定问题是什么,因为我在内部select语句中包含了一个GROUP BY子句,我是否还需要一个outter select查询?另外,如何在最终返回结果中将其修改为ORDER BY EndDateTime DESC?提前谢谢。

更新:

感谢大家的反馈,我纠正了错误并学到了新的东西。感谢。

4 个答案:

答案 0 :(得分:3)

您需要在select语句中汇总MAX(), MIN(), AVG()GROUP BY EVERY 字段。

您没有导致问题的GROUP或汇总ID, Column_3 - Column_5

答案 1 :(得分:1)

您需要包含未汇总的所有列。我认为你应该做到以下几点:

SELECT o.ID
    ,o.Column_2
    ,t.MaxDate AS [End Date Time]
    ,o.Column_3
    ,o.Column_4
    ,o.Column_5
FROM (
    SELECT ID
        ,MAX(EndDateTime) AS MaxDate
    FROM @MyTable
    GROUP BY ID
    ) t
INNER JOIN @MyTable o ON t.ID = o.ID
    AND t.MaxDate = o.EndDateTime

答案 2 :(得分:0)

错误来自最里面的SELECT查询。它告诉您,您不能在一列上应用聚合字段,按第二列分组,然后对另一列不执行任何操作4.尝试相反(结果可能会有所不同,具体取决于您实际尝试生成的内容)结果):

SELECT t.ID
    ,t.Column_2
    ,t.MaxDate AS [End Date Time]
    ,t.Column_3
    ,t.Column_4
    ,t.Column_5
FROM (
    SELECT ID
        ,Column_2
        ,MAX(EndDateTime) AS MaxDate
        ,Column_3
        ,Column_4
        ,Column_5
    FROM @MyTable
    GROUP BY ID,Column_2,Column_3,Column_4,Column_5
    ) t
INNER JOIN @MyTable o ON t.ID = o.ID
    AND t.MaxDate = o.EndDateTime

答案 3 :(得分:-1)

当您通过select中的所有项目定义组时,必须包含在group by子句中或包含在聚合中,以便服务器知道如何处理分组值。在你的内心选择中你需要做这样的事情:

   SELECT ID
    ,Column_2
    ,MAX(EndDateTime) AS MaxDate
    ,Column_3
    ,Column_4
    ,Column_5
FROM @MyTable
GROUP BY ID
    ,Column_2
    ,EndDateTime
    ,Column_3
    ,Column_4
    ,Column_5

OR

SELECT SUM(ID)
    ,Column_2
    ,MAX(EndDateTime) AS MaxDate
    ,SUM(Column_3)
    ,SUM(Column_4)
    ,SUM(Column_5)
FROM @MyTable
GROUP BY Column_2

不提供聚合或在组中包含其他列的行为将是未定义的。