0

我一定遗漏了一些明显的东西,但为什么会出现以下情况

SELECT     c.ContractID, max( cs.ContractStatusCreated)
FROM       dbo.NMPT_Contract AS c INNER JOIN
           dbo.NMPT_ContractStatus AS cs ON c.ContractID = cs.ContractID INNER JOIN
           dbo.CMSS_Status AS s ON cs.StatusID = s.StatusID
group by  c.ContractID
having cs.ContractStatusCreated = MAX(cs.ContractStatusCreated)

从 SQL Server 2000 返回以下内容?

消息 8121,级别 16,状态 1,行 1 列 'cs.ContractStatusCreated' 在 HAVING 子句中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。

不是MAX聚合函数吗?

4

3 回答 3

1

错误:

消息 8121,级别 16,状态 1,行 1 列 'cs.ContractStatusCreated' 在 HAVING 子句中无效,因为它既不包含在聚合函数或 GROUP BY 子句中。

MAX 是聚合函数

但 ContractStatusCreated 不在 Group By 中

于 2012-07-12T14:53:07.950 回答
1

因为cs.ContractStatusCreated不在 group-by 子句中,所以它不知道从哪里获取数据。

更好的是,如果你按它分组,你最终会遇到一个HAVING 1=1条件,你max(cs.ContractStatusCreated)不会做你想做的事。我认为您需要一个自联接或子查询来找到要比较的最大值。

于 2012-07-12T14:53:09.637 回答
0

还没有检查这个,但你可以把你的'max'写成一个像这样的子查询:

select     ContractID, ContractStatusCreated
FROM       dbo.NMPT_Contract AS x INNER JOIN            
           dbo.NMPT_ContractStatus AS y ON x.ContractID = y.ContractID
where (x.ContractID, y.ContractStatusCreated) = (
    SELECT     c.ContractID, max( cs.ContractStatusCreated) 
    FROM       dbo.NMPT_Contract AS c INNER JOIN            
               dbo.NMPT_ContractStatus AS cs ON c.ContractID = cs.ContractID INNER JOIN            
               dbo.CMSS_Status AS s ON cs.StatusID = s.StatusID 
    group by  c.ContractID
)
于 2012-07-12T15:02:37.200 回答