Ошибка TSQL в предложении GROUP By - PullRequest
0 голосов
/ 26 октября 2011

У меня следующий запрос к заполненной табличной переменной, которая должна возвращать строки или каждую с самой последней датой:

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. Не уверен, в чем проблема, поскольку я включаю предложение GROUP BY во внутреннюю инструкцию выбора, мне также нужен один внешний запрос выбора? Кроме того, как можно изменить это до ORDER BY EndDateTime DESC в конечном результате возврата? Заранее спасибо.

UPDATE:

Спасибо всем за отзыв, я исправил ошибку и узнал что-то новое. БЛАГОДАРЯ.

Ответы [ 4 ]

3 голосов
/ 26 октября 2011

Вам нужно либо агрегировать MAX(), MIN(), AVG(), либо GROUP BY КАЖДЫЙ в операторе выбора.

Вы не GROUP или не агрегируете ID, Column_3 - Column_5, который вызывает проблему.

1 голос
/ 26 октября 2011

Вам необходимо включить все столбцы, которые вы не агрегируете.Я думаю, что вы должны сделать следующее:

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
0 голосов
/ 26 октября 2011

Когда вы определяете группу по всем элементам в вашем выборе, они должны быть либо включены в предложение 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

Без указания агрегата или включения дополнительных столбцов в группу по их поведению будет неопределенным.

0 голосов
/ 26 октября 2011

Ошибка исходит из самого внутреннего запроса 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...