SQL Server 2012:获取ID为0的计数与Name拼接的单行两列结果
解决SQL Server 2012的统计与字符串拼接需求
我来帮你搞定这个需求!先明确你的场景:
表结构与测试数据
你的table_1表结构和数据如下:
CREATE TABLE table_1 ([ID] BIT, [Name] VARCHAR(10)) INSERT INTO table_1 ([ID],[Name]) VALUES (1,'A') INSERT INTO table_1 ([ID],[Name]) VALUES (0,'B') INSERT INTO table_1 ([ID],[Name]) VALUES (0,'C')
需求说明
需要返回单行两列的结果:
col_1:ID字段值为0的记录数量col_2:这些ID=0的记录对应的Name字段拼接后的字符串;如果没有符合条件的记录(计数为0),则显示NA或空值
完整解决方案SQL
你现有的SQL只实现了计数部分,我帮你补充字符串拼接和空值处理的逻辑,用SQL Server 2012支持的语法实现:
SELECT -- 统计ID=0的记录数,无匹配时返回0 COUNT(CASE WHEN ID = 0 THEN 1 END) AS col_1, -- 拼接Name字符串,无匹配时返回'NA'(换成''就是空值) ISNULL(STUFF(( SELECT ',' + Name FROM table_1 WHERE ID = 0 FOR XML PATH(''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 1, ''), 'NA') AS col_2 FROM table_1;
代码解释
- 计数逻辑:
COUNT(CASE WHEN ID=0 THEN 1 END)会遍历所有记录,只统计ID=0的行,没有匹配时返回0,确保始终返回单行结果。 - 字符串拼接:
STUFF+FOR XML PATH('')是SQL Server 2012中实现字符串聚合的经典写法:FOR XML PATH('')把符合条件的Name行拼接成类似,B,C的XML字符串STUFF(...,1,1,'')去掉开头的逗号,得到B,C
- 空值处理:
ISNULL(..., 'NA')会在没有匹配记录时,把拼接结果的NULL替换成NA,如果需要空值,把'NA'改成''即可。
测试验证
- 当表中有ID=0的记录时,结果为:
col_1=2, col_2='B,C' - 当表中没有ID=0的记录时,结果为:
col_1=0, col_2='NA'
内容的提问来源于stack exchange,提问作者300
相关产品推荐
相关产品推荐

