在t-sql中分组不显示单个结果

时间:2011-03-21 09:57:00

标签: sql sql-server tsql

见下图。我有一个表,tbl_AccountTransaction,其中我有10行。最下面的表有columsn AccountTransactionId,AgreementId等等。现在我想要的是获得一行,即所有协议ID的总和。在这里说我有协议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 个答案:

答案 0 :(得分:3)

您的group by子句错误

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

这使得它按statementdate列的日期(没有时间)分组。原始文件是按声明日期(包括时间)分组,然后是输出的每一行,应用剥离时间信息。

要清楚,你不应该改变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)

答案 1 :(得分:2)

因为你有一个Group By StatementDate。

在您的示例中,您有2个StatementDates:

  

2011-03-21 14:38:59.470
  2011-03-21 14:38:59.487

将分组中的查询而不是StatementDate更改为:

  

Convert(Date,StatementDate,101)

答案 2 :(得分:1)

你有没有试过

Group by (Convert(date,...) 

而不是StatementDate

答案 3 :(得分:1)

你很亲密。你需要结合你的两种方法。这应该这样做:

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

答案 4 :(得分:0)

如果您从不需要时间,可能需要更改数据类型,因此您不必在大多数查询中进行大量不必要的转换。 SQL Server 2008具有不包含时间的日期数据类型。在早期版本中,您可以添加一个自动生成的附加日期列,以删除时间companent,以便所有日期都像'2011-01-01 00:00:00:000'的格式,然后您可以直接进行日期比较只需要进行一次转换。这将允许您同时拥有实际日期时间和日期。

答案 5 :(得分:-1)

您应按DATEPART(...,StatementDate)分组

参考:http://msdn.microsoft.com/en-us/library/ms174420.aspx