如何用SQL统计customer表中姓氏以各字母开头的记录数量
姓氏首字母统计高效实现方案
你用分组聚合的方式一次查询就能拿到所有首字母的统计结果,不需要逐个写字母的查询条件,以下是适配你用的SQL Server环境的方案:
基础方案(仅返回有记录的首字母)
直接取姓氏首字母分组统计即可,仅需扫描一次表,性能远高于多次单字母查询:
-- 直接返回首字母和对应数量两列 SELECT UPPER(LEFT(last_name, 1)) AS 首字母, COUNT(Id) AS 记录数量 FROM [dbo].[customer] WHERE last_name IS NOT NULL AND last_name != '' GROUP BY UPPER(LEFT(last_name, 1)) ORDER BY 首字母
如果需要直接输出你要的字母,数量格式的单行结果,调整查询即可:
-- 直接输出符合要求的逗号拼接格式 SELECT CONCAT(UPPER(LEFT(last_name, 1)), ',', COUNT(Id)) AS 统计结果 FROM [dbo].[customer] WHERE last_name IS NOT NULL AND last_name != '' GROUP BY UPPER(LEFT(last_name, 1)) ORDER BY UPPER(LEFT(last_name, 1))
扩展方案(包含无记录的首字母,统计为0)
如果需要A-Z所有字母都出结果,没有对应记录的数量显示为0,可以先生成26字母的临时列表再左关联业务表:
WITH 字母列表 AS ( SELECT CHAR(ASCII('A') + number) AS 字母 FROM master.dbo.spt_values WHERE type = 'P' AND number BETWEEN 0 AND 25 ) SELECT CONCAT(l.字母, ',', ISNULL(COUNT(c.Id), 0)) AS 统计结果 FROM 字母列表 l LEFT JOIN [dbo].[customer] c ON UPPER(LEFT(c.last_name, 1)) = l.字母 AND c.last_name IS NOT NULL AND c.last_name != '' GROUP BY l.字母 ORDER BY l.字母
方案说明
- 外层套
UPPER()是为了统一大小写,避免首字母小写的记录被分到单独的分组 - 过滤空值是为了避免空姓氏的无效统计,不需要可以删除WHERE条件里的对应判断
内容的提问来源于stack exchange,提问作者victor martinez
相关产品推荐
相关产品推荐

