见下图。我有一个表,tbl_AccountTransaction,其中我有10行。最下面的表有columsn AccountTransactionId,AgreementId等等。现在我想要的是获得一行,即所有协议ID的总和。在这里说我有协议id = 23但是当我运行我的查询时它给我两行而不是单列,因为插入时间之间存在纳米或微秒的差异。 所以我需要一种能让我行 1550 |的方法23 | 2011-03-21
更新
我已将查询更新到此
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.
答案 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)分组