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

SQL Server如何按年份分组生成对应唯一品牌数组的JSON

SQL查询实现按年份分组的品牌JSON输出

要生成以唯一年份为键、对应年份下唯一品牌数组的JSON结构,可以通过CTE分组聚合+字符串拼接的方式实现,以下是针对SQL Server的具体查询方案:

基础版本(兼容SQL Server 2017+)

假设你的表名为VehicleData,包含Year(年份字段)和Make(品牌字段),替换成你的实际表名和字段即可:

-- 按年份分组,聚合去重后的品牌为字符串
WITH YearlyMakes AS (
    SELECT
        [Year],
        -- 用双引号分隔品牌,方便后续组装JSON数组
        STRING_AGG(DISTINCT Make, '","') AS MakesList
    FROM VehicleData
    GROUP BY [Year]
)
-- 拼接成目标JSON格式
SELECT 
    CONCAT(
        '{',
        STRING_AGG(
            CONCAT('"', [Year], '": ["', MakesList, '"]'),
            ', '
        ),
        '}'
    ) AS YearlyMakeJson
FROM YearlyMakes

简洁版本(SQL Server 2022+)

如果使用的是SQL Server 2022及以上版本,可以用JSON_ARRAYAGG直接生成JSON数组,无需手动拼接:

-- 按年份分组,直接生成品牌数组
WITH YearlyMakes AS (
    SELECT
        [Year],
        JSON_ARRAYAGG(DISTINCT Make) AS MakesArray
    FROM VehicleData
    GROUP BY [Year]
)
-- 拼接成目标JSON对象
SELECT 
    CONCAT(
        '{',
        STRING_AGG(
            CONCAT('"', [Year], '": ', MakesArray),
            ', '
        ),
        '}'
    ) AS YearlyMakeJson
FROM YearlyMakes

处理特殊字符的版本

如果品牌或年份字段包含双引号等JSON特殊字符,需要用STRING_ESCAPE转义,避免JSON格式错误:

WITH YearlyMakes AS (
    SELECT
        [Year],
        STRING_AGG(DISTINCT STRING_ESCAPE(Make, 'json'), '","') AS MakesList
    FROM VehicleData
    GROUP BY [Year]
)
SELECT 
    CONCAT(
        '{',
        STRING_AGG(
            CONCAT('"', STRING_ESCAPE([Year], 'json'), '": ["', MakesList, '"]'),
            ', '
        ),
        '}'
    ) AS YearlyMakeJson
FROM YearlyMakes

说明

  • 上述查询会直接输出你需要的JSON字符串格式,不需要额外的FOR JSON PATH嵌套(因为目标结构是动态键,FOR JSON默认生成的是数组结构,无法直接生成动态键的对象,因此用字符串拼接更直接)。
  • 如果你的数据库是其他类型(比如MySQL、PostgreSQL),语法会有差异,但核心思路都是先分组聚合,再拼接成目标JSON结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:35:20