SQL HAVING子句没有返回我的期望

时间:2014-06-02 20:05:35

标签: sql sql-server sql-server-2008 having

我遇到SQL查询问题。有问题的查询如下所示:

SELECT TOP 3 r2.fdtmFilingPeriod 
FROM  TBLRETURN r2
WHERE r2.fstrDocType       = 'RT3001' 
AND   r2.FLNGVER           = 0 
AND   r2.fstrStatus        in ('RCVD', 'SUS') 
--AND r2.flngAccountKey    = 669 --has one row in the table     -- should return 0 rows
AND   r2.FLNGACCOUNTKEY    = 265   --has several rows the table -- should return 3 rows
GROUP BY r2.fdtmFilingPeriod
--HAVING COUNT(r2.fdtmFilingPeriod) > 2
ORDER BY    r2.FDTMFILINGPERIOD DESC;

这里奇怪的是,当我取消注释HAVING子句时,我并没有完全得到数据库中的内容。运行上述查询时得到的是:

2013-12-31 00:00:00.000
2013-09-30 00:00:00.000
2013-06-30 00:00:00.000

这显然不止两行,但是当我取消注释HAVING子句时,我没有返回任何行。有人可以帮我弄清楚这里发生了什么吗?

我正在使用SQL Server 2008.

提前致谢。

1 个答案:

答案 0 :(得分:5)

HAVING类似于WHERE子句,但是在分组完成后进行分组的聚合数据。

你有:

HAVING COUNT(r2.fdtmFilingPeriod) > 2

首先,COUNT(r2.fdtmFilingPeriod)仅表示在您指定的分组中计算非空字段。因此,基于fdtmFilingPeriodCOUNT是什么?

在你提到的这些行中,计数是:

2013-12-31 00:00:00.000    1
2013-09-30 00:00:00.000    2

这些行都不会传递您的HAVING子句。

此外,为了更轻松地查看HAVING正在做出决定的内容,只需更改查询以添加您要过滤的COUNT

SELECT TOP 3 r2.fdtmFilingPeriod, COUNT(r2.fdtmFilingPeriod) AS CNT
FROM  TBLRETURN r2
WHERE r2.fstrDocType       = 'RT3001' 
AND   r2.FLNGVER           = 0 
AND   r2.fstrStatus        in ('RCVD', 'SUS') 
--AND r2.flngAccountKey    = 669 --has one row in the table     -- should return 0 rows
AND   r2.FLNGACCOUNTKEY    = 265   --has several rows the table -- should return 3 rows
GROUP BY r2.fdtmFilingPeriod
--HAVING COUNT(r2.fdtmFilingPeriod) > 2
ORDER BY    r2.FDTMFILINGPERIOD DESC;