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.
提前致谢.
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)