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

SQL Server:按分组将查询列转换为JSON对象

适用于SQL Server的JSON转换方案

看了你的测试数据和需求,我整理了几种不同结构的JSON输出方案,你可以根据实际需要选择:

1. 按ID聚合,嵌套ValueV对应的KEYS列表

这个方案会把同一个ID下的数据按ValueV分组,生成层级清晰的嵌套JSON:

SELECT 
    ID,
    (
        SELECT 
            ValueV,
            STRING_AGG(KEYS, ', ') AS KeysList
        FROM #Test t2
        WHERE t2.ID = t1.ID
        GROUP BY ValueV
        FOR JSON PATH
    ) AS ValueGroups
FROM #Test t1
GROUP BY ID
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;

2. 每个(ValueV, ID)组作为独立JSON对象

如果需要更扁平的结构,每个ValueV+ID组合对应一个JSON对象:

SELECT 
    ID,
    ValueV,
    STRING_AGG(KEYS, ', ') AS KeysList
FROM #Test
GROUP BY ID, ValueV
FOR JSON PATH;

3. 将KEYS转为JSON数组而非字符串

要是希望KeysList是标准的JSON数组(而不是逗号分隔的字符串),可以用子查询生成数组:

SELECT 
    ID,
    (
        SELECT 
            ValueV,
            (SELECT KEYS FROM #Test t3 WHERE t3.ID = t2.ID AND t3.ValueV = t2.ValueV FOR JSON PATH) AS KeysArray
        FROM #Test t2
        WHERE t2.ID = t1.ID
        GROUP BY ValueV
        FOR JSON PATH
    ) AS ValueGroups
FROM #Test t1
GROUP BY ID
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER;

补充说明

  • STRING_AGG是SQL Server 2017及以上版本支持的聚合函数,用来合并字符串;如果你的版本低于2017,可以用STUFF + FOR XML PATH的写法替代:
    -- 替代STRING_AGG的写法
    STUFF((SELECT ', ' + KEYS FROM #Test t2 WHERE t2.ID = t1.ID AND t2.ValueV = t1.ValueV FOR XML PATH('')), 1, 2, '') AS KeysList
    
  • FOR JSON PATH是SQL Server自带的JSON生成工具,WITHOUT_ARRAY_WRAPPER参数会移除最外层的数组括号,让输出更符合单个对象或对象集合的格式。

内容的提问来源于stack exchange,提问作者SQL_M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:13:02