Группировка по t-sql не отображает ни одного результата - PullRequest
0 голосов
/ 21 марта 2011

См. Изображение ниже. У меня есть таблица, tbl_AccountTransaction, в которой у меня есть 10 строк. Самая нижняя таблица имеет столбец AccountTransactionId, AgreementId и так далее. Теперь я хочу получить одну строку, то есть сумму всего идентификатора соглашения. Скажем, здесь у меня есть соглашение id = 23, но когда я выполнил свой запрос, он дал мне две строки вместо одного столбца, поскольку между временем вставки существует нано или микросекундная разница. Поэтому мне нужен способ, который даст мне строку 1550 | 23 | 2011-03-21

enter image description here

Обновление

Я обновил свой запрос до этого

SELECT  Sum(Amount) as Amount,AgreementID, StatementDate
FROM         tbl_AccountTranscation
Where TranscationDate is null
GROUP BY AgreementID,Convert(date,StatementDate,101)

но все равно получаю ту же ошибку

Msg 8120, Level 16, State 1, Line 1
Column 'tbl_AccountTranscation.StatementDate' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Ответы [ 6 ]

3 голосов
/ 21 марта 2011

Ошибка вашего предложения group by

group by agreementid, convert(date,statementdate,101)

Это делает его сгруппированным по дате (без времени) столбца datedate.Принимая во внимание, что оригинал группируется по дате утверждения (включая время), а затем для каждой строки вывода, применяя извлечение информации о времени.

Чтобы было ясно, вы не должны были изменять предложение SELECT

SELECT  Sum(Amount) as Amount,AgreementID, Convert(date,StatementDate,101)
FROM         tbl_AccountTranscation
Where TranscationDate is null
GROUP BY AgreementID,Convert(date,StatementDate,101)
2 голосов
/ 21 марта 2011

Поскольку у вас есть дата создания группы.

В вашем примере у вас есть 2 StatementDates:

2011-03-21 14: 38: 59.470
2011-03-21 14: 38: 59,487

Измените свой запрос в группе по разделам вместо StatementDate на:

Преобразование (дата, ведомость, 101)

1 голос
/ 21 марта 2011

Вы рядом. Вам нужно объединить два подхода. Это должно сделать это:

SELECT  Sum(Amount) as Amount,AgreementID, Convert(date,StatementDate,101)
FROM         tbl_AccountTranscation
Where TranscationDate is null
GROUP BY AgreementID,Convert(date,StatementDate,101)
1 голос
/ 21 марта 2011

Вы пытались

Group by (Convert(date,...) 

вместо StatementDate

0 голосов
/ 23 марта 2011

Если вам никогда не нужно время, возможно, вам нужно изменить тип данных, чтобы вам не приходилось выполнять много ненужных преобразований в большинстве запросов. SQL Server 2008 имеет тип данных date, который не включает время. В более ранних версиях вы могли добавить дополнительный столбец даты, который автоматически генерируется, чтобы удалить компонент времени, чтобы все даты были похожи на формат «2011-01-01 00: 00: 00: 000», тогда вы можете напрямую сравнивать даты нужно было сделать преобразование только один раз. Это позволит вам иметь как фактическую дату, так и только дату.

0 голосов
/ 21 марта 2011

Вы должны сгруппировать по DATEPART (..., StatementDate)

Ссылка: http://msdn.microsoft.com/en-us/library/ms174420.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...