如何统计T-SQL查询中符合条件的不同(StateProvince, City)组合数量?
正确的T-SQL写法统计不同(StateProvince, City)组合数量
你的代码存在两个关键问题:
- T-SQL 的
COUNT(DISTINCT)不支持同时传入多个列作为参数 OVER(PARTITION BY )缺少分区字段,属于语法错误
根据不同需求,提供两种常用的正确写法:
场景1:仅获取符合条件的组合总数
如果只需要统计总共有多少个不同的(StateProvince, City)组合,可以先通过子查询/CTE获取去重后的结果,再统计行数:
SELECT COUNT(*) AS UniqueCombinationCount FROM ( SELECT DISTINCT StateProvince, City FROM adventureworks.SalesLT.Address WHERE CountryRegion = 'Canada' AND StateProvince != 'Quebec' ) AS DistinctCombos
也可以用 GROUP BY 替代 DISTINCT,效果完全一致:
SELECT COUNT(*) AS UniqueCombinationCount FROM ( SELECT StateProvince, City FROM adventureworks.SalesLT.Address WHERE CountryRegion = 'Canada' AND StateProvince != 'Quebec' GROUP BY StateProvince, City ) AS GroupedCombos
场景2:保留明细同时显示总数
如果需要在原有去重的(StateProvince, City)列表每行中,都显示总组合数量,可以结合窗口函数使用:
SELECT StateProvince, City, COUNT(*) OVER () AS TotalUniqueCombinations FROM ( SELECT DISTINCT StateProvince, City FROM adventureworks.SalesLT.Address WHERE CountryRegion = 'Canada' AND StateProvince != 'Quebec' ) AS DistinctCombos ORDER BY StateProvince, City
额外优化提示
原查询中使用 LIKE 'Canada' 可以改为 = 'Canada',因为没有通配符,= 的执行效率更高。
内容的提问来源于stack exchange,提问作者trung viet
相关产品推荐
相关产品推荐

