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

Yan*_*nni 0 sql sql-server having sql-server-2008

我遇到了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;
Run Code Online (Sandbox Code Playgroud)

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

2013-12-31 00:00:00.000
2013-09-30 00:00:00.000
2013-06-30 00:00:00.000
Run Code Online (Sandbox Code Playgroud)

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

我正在使用SQL Server 2008.

提前致谢.

woo*_*oot 5

HAVING就像一个WHERE子句,但是在分组完成后分组的聚合数据.

你有:

HAVING COUNT(r2.fdtmFilingPeriod) > 2
Run Code Online (Sandbox Code Playgroud)

首先,COUNT(r2.fdtmFilingPeriod)只是意味着计算您指定的分组中的非空字段.所以在每个fdtmFilingPeriod基础上,是什么COUNT

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

2013-12-31 00:00:00.000    1
2013-09-30 00:00:00.000    2
Run Code Online (Sandbox Code Playgroud)

这些行都不会通过您的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;
Run Code Online (Sandbox Code Playgroud)