我遇到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.
提前致谢。
答案 0 :(得分:5)
HAVING
类似于WHERE
子句,但是在分组完成后进行分组的聚合数据。
你有:
HAVING COUNT(r2.fdtmFilingPeriod) > 2
首先,COUNT(r2.fdtmFilingPeriod)
仅表示在您指定的分组中计算非空字段。因此,基于fdtmFilingPeriod
,COUNT
是什么?
在你提到的这些行中,计数是:
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;