如何获取子查询过滤前后的行数?无法使用CTE的解决方案
解决方案
要同时获取子查询过滤前的总行数,以及分组过滤后的结果行数,且脚本第一条必须为SELECT语句,可采用以下几种方式:
方式一:嵌套子查询直接统计
通过两个独立子查询分别计算两个数值,在同一SELECT语句中返回:
SELECT (SELECT COUNT(fname) FROM @table) AS 过滤前行数, (SELECT COUNT(*) FROM ( SELECT fname FROM @table GROUP BY LEFT(fname, 3) HAVING COUNT(*) = 2 ) AS Filtered) AS 过滤后行数
方式二:窗口函数一次性计算
利用窗口函数在分组统计的同时,计算全局总行数和过滤后的结果行数,最后去重得到单一结果:
SELECT DISTINCT SUM(COUNT(*)) OVER() AS 过滤前行数, -- 所有分组行数之和即为过滤前总行数 COUNT(*) OVER() AS 过滤后行数 -- 过滤后的分组数量 FROM @table GROUP BY LEFT(fname, 3) HAVING COUNT(*) = 2
方式三:临时表适配“SELECT开头”限制
如果脚本必须以SELECT开头(无法提前声明表变量),可将数据导入临时表后再统计:
SELECT (SELECT COUNT(fname) FROM #temp) AS 过滤前行数, (SELECT COUNT(*) FROM ( SELECT fname FROM #temp GROUP BY LEFT(fname, 3) HAVING COUNT(*) = 2 ) AS Filtered) AS 过滤后行数 FROM ( SELECT * INTO #temp FROM ( VALUES ('Joe A', 1), ('Joe M', 1), ('Bob K', 2), ('Bob J', 2), ('Joe Z', 4) ) AS t(FName, EmpId) ) AS Init DROP TABLE #temp
内容的提问来源于stack exchange,提问作者fdkgfosfskjdlsjdlkfsf
相关产品推荐
相关产品推荐

