You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

已用该代码创建视图,效果符合预期,需确认方案可行性。


方案可行性分析
  1. 版本与语法兼容性

    • SQL Server 14.0(即2017版本)原生支持STRING_SPLIT和TRIM函数,你的代码语法完全适配该版本,不存在兼容性问题。如果ids字段本身就是字符类型,可以省略cast(ids as varchar),减少不必要的类型转换开销。
  2. 功能正确性

    • 代码逻辑清晰:拆分逗号分隔的ids、去除空格后关联table1的id字段求和,完全匹配需求,且验证后效果符合预期,功能层面可靠。
  3. 性能与维护性

    • 若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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:15:47