如何使用SQL统计列值出现次数 同时保留对应唯一值列数据
问题原因
order是SQL的保留关键字,直接作为字段名使用会被SQL解析器识别为排序语法,必须加转义符才能正常识别为字段- 你写的
A.0rder存在拼写错误,开头是数字0而非字母O,会被识别为不存在的字段 - 部分对SQL语法校验严格的数据库(如BigQuery、Salesforce SOQL)会对非标准JOIN写法报错,用窗口函数可以完全规避JOIN写法,更简洁高效
解决方案1:修正原有JOIN写法
SELECT A.id, A.`order`, B.cnt FROM Customers A INNER JOIN ( SELECT `order`, COUNT(`order`) AS cnt FROM Customers GROUP BY `order` ) B ON A.`order` = B.`order`
注:如果你的数据库不支持反引号转义关键字,可以替换为对应数据库的转义符:SQL Server用
[order],Oracle用"order"。
解决方案2:窗口函数写法(更推荐,无JOIN完全规避语法报错)
这种写法不需要额外关联子查询,直接按order字段分组统计同组总数,输出结果和你预期的完全一致:
SELECT id, `order`, COUNT(*) OVER (PARTITION BY `order`) AS `count` FROM Customers
内容的提问来源于stack exchange,提问作者Akeem Hinds
相关产品推荐
相关产品推荐

