GROUPBY子句中的TSQL错误

GROUPBY子句中的TSQL错误,sql,sql-server,sql-server-2005,tsql,sql-server-2008,Sql,Sql Server,Sql Server 2005,Tsql,Sql Server 2008,我对填充的表变量进行了以下查询,该变量应返回行或每个行的最新日期: 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 ,Col

我对填充的表变量进行了以下查询,该变量应返回行或每个行的最新日期:

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
我不断收到错误:
列'@MyTable.ID'在select列表中无效,因为它未包含在聚合函数或GROUP BY子句中。
不确定问题是什么,因为我在内部select语句中包含GROUP BY子句,是否还需要一个OUTER select查询?另外,如何在最终返回结果中将其修改为按EndDateTime DESC排序??先谢谢你

更新:


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

您需要聚合select语句中的每个
字段的
MAX()、MIN()、AVG()
分组依据


您不必对导致问题的
ID、第3列-第5列
进行分组或聚合。

您需要在select语句中的每个
字段中聚合
MAX()、MIN()、AVG()
分组


您不必对导致问题的
ID、第3列-第5列进行分组或聚合。

您需要包括所有未聚合的列。我认为你应该做以下几点:

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

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

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

错误来自最内部的
SELECT
查询。它告诉您不能在一列上应用聚合字段,按第二列分组,然后对其他4列不做任何操作。试试这个(结果可能会有所不同,这取决于您实际试图产生的结果):


错误来自最内部的
SELECT
查询。它告诉您不能在一列上应用聚合字段,按第二列分组,然后对其他4列不做任何操作。试试这个(结果可能会有所不同,这取决于您实际试图产生的结果):


定义group by时,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


如果不提供聚合或不按其行为包含组中的其他列,则将无法定义。

当您按定义组时,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


如果不提供聚合或不按其行为包含组中的其他列,则将无法定义。

+1用于简化发布的查询。我认为这可能是他应该做的。如果
ID
是一个关键字段,那么
groupbyid
将始终选择每一行,使子句毫无意义。海报需要解释他试图实现的目标。@DourHighArch-你是对的,但是如果
ID
是一个键,那么当op试图获得最长日期时,它不应该出现在
SELECT
上。+1用于简化发布的查询。我认为这可能是他应该做的。如果
ID
是一个关键字段,那么
groupbyid
将始终选择每一行,使子句毫无意义。海报需要解释他试图实现的目标。@DourHighArch-你是对的,但是如果
ID
是一个键,那么当op试图获得一个最大日期时,它不应该出现在
SELECT
上。这不是我的反对票,但你将max(EndDateTime)作为组中的一个字段,谢谢,JML。我想知道他们是否反对这笔钱。分组聚合已删除。这不是我的否决票,但您将MAX(EndDateTime)作为组中的字段之一,ByThank,JML。我想知道他们是否反对这笔钱。已移除分组的聚合。