SQL Server 14.0中如何按文本字段内ID汇总对应值?
问题描述
现有两张表:一张含id与id_value字段,另一张的ids字段为逗号分隔的ID文本(SQL Server版本14.0)。示例数据如下:
id id_value grid ids xxxx 1 3 1 1,3 xxxx 2 7 2 2 xxxx 3 5 3 2,3 xxxx
期望输出:
Grid ids totalvalue 1 1,3 8 2 2 7 3 2,3 12
注:忽略连字符和下划线。
需求:根据ids字段中的每个ID,关联另一表汇总对应的id_value总和。目前通过C#的DataGridView实现,但需用SQL语法生成新表以适配数据定期更新。
尝试的代码:
select sum(id_value) from dbo.table1 where dbo.table1.id in (select trim(value) from string_split(cast(ids as varchar), ','))) as totalvalue
已用该代码创建视图,效果符合预期,需确认方案可行性。
方案可行性分析
版本与语法兼容性
- SQL Server 14.0(即2017版本)原生支持
STRING_SPLIT和TRIM函数,你的代码语法完全适配该版本,不存在兼容性问题。如果ids字段本身就是字符类型,可以省略cast(ids as varchar),减少不必要的类型转换开销。
- SQL Server 14.0(即2017版本)原生支持
功能正确性
- 代码逻辑清晰:拆分逗号分隔的
ids、去除空格后关联table1的id字段求和,完全匹配需求,且验证后效果符合预期,功能层面可靠。
- 代码逻辑清晰:拆分逗号分隔的
性能与维护性
- 若
table1的id字段有索引,关联查询效率会更有保障;数据量较大时,建议给id字段添加非聚集索引。 - 用视图实现的话,每次查询都会实时计算最新的
totalvalue,刚好适配数据定期更新的场景,无需额外定时任务同步数据,维护成本低。
- 若
优化建议
补充完整的视图SQL,确保输出所有需要的字段:
CREATE VIEW vw_total_value AS SELECT t2.grid, t2.ids, ISNULL(SUM(t1.id_value), 0) AS totalvalue FROM dbo.table2 t2 LEFT JOIN dbo.table1 t1 ON t1.id IN (SELECT TRIM(value) FROM STRING_SPLIT(CAST(t2.ids AS VARCHAR), ',')) GROUP BY t2.grid, t2.ids;
这里用LEFT JOIN替代子查询,逻辑更直观;ISNULL确保当ids中的ID在table1不存在时,totalvalue显示为0而非NULL,更贴合业务需求。
内容的提问来源于stack exchange,提问作者NoobAtSql
相关产品推荐
相关产品推荐

