SQL截取ParcelID统计次数时报PID列无效的问题如何解决
报错原因
- SQL的执行顺序中,
SELECT子句的执行优先级晚于GROUP BY、窗口函数计算等逻辑,因此你在同层级SELECT中定义的别名PID,无法直接被同层级的聚合函数COUNT()引用。 - 统计分组出现次数的逻辑缺少分组规则,没有指定按什么维度统计计数,本身也不符合聚合查询的语法要求。
解决方法
可以根据你的实际需求选择以下两种写法:
方案1:仅统计每个截取后PID的总出现次数(不需要保留原始ParcelID)
直接在COUNT和GROUP BY中重复截取逻辑即可,是性能最优的写法:
SELECT SUBSTRING(ParcelID, 1, 12) AS PID, COUNT(*) AS PIDCount FROM dbo.RptCDMGISExtract GROUP BY SUBSTRING(ParcelID, 1, 12)
方案2:保留所有原始ParcelID记录,每条记录附带对应PID的总出现次数
用窗口函数实现,不需要分组折叠数据:
SELECT ParcelID, SUBSTRING(ParcelID, 1, 12) AS PID, COUNT(*) OVER (PARTITION BY SUBSTRING(ParcelID, 1, 12)) AS PIDCount FROM dbo.RptCDMGISExtract
如果你的数据库支持CTE语法,也可以先定义别名再做统计,避免重复写截取逻辑,可读性更高:
WITH PIDExtract AS ( SELECT ParcelID, SUBSTRING(ParcelID, 1, 12) AS PID FROM dbo.RptCDMGISExtract ) SELECT PID, COUNT(*) AS PIDCount FROM PIDExtract GROUP BY PID
内容的提问来源于stack exchange,提问作者Steve Fama
相关产品推荐
相关产品推荐

