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

SQL Server按日期分组生成指定结构JSON的查询语句求助

解决SQL Server生成指定分组JSON结构的问题

我来帮你搞定这个需求!首先得提个小问题:你当前数据表中的日期格式YYYY-DD-MM(比如2019-30-10)在SQL Server里是不合法的,直接用会触发日期转换错误,建议先把日期调整为标准的YYYY-MM-DD格式(比如2019-10-30),或者在查询里先做格式转换处理。

接下来是实现你想要的JSON结构的SQL语句,核心思路是嵌套使用FOR JSON子句,先按日期分组生成每个日期对应的Name数组,再把这些日期键值对包装到"Name"对象中:

-- 假设你的表名为YourTable,执行以下查询
SELECT
    (SELECT
         -- 按你需要的日期格式生成键名,先把日期转为DATE类型避免格式错误
         FORMAT(CAST(t1.Date AS DATE), 'yyyy-dd-MM') AS [key],
         -- 生成当前日期对应的Name数组
         (SELECT Name FROM YourTable t2 
          WHERE CAST(t2.Date AS DATE) = CAST(t1.Date AS DATE) 
          FOR JSON PATH) AS [value]
     FROM YourTable t1
     -- 按实际日期分组,确保相同日期的记录被归到一组
     GROUP BY CAST(t1.Date AS DATE)
     -- 按日期降序排列,匹配你示例中的顺序
     ORDER BY CAST(t1.Date AS DATE) DESC
     -- 把分组结果转为对象而非数组
     FOR JSON PATH, WITHOUT_ARRAY_WRAPPER) AS [Name]
-- 最终把整个结构转为顶层对象
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

代码解释

  1. 内层子查询:负责按日期分组,为每个日期生成对应的Name数组,用FOR JSON PATH输出[{"Name": "xxx"}, ...]的数组格式。
  2. FORMAT(CAST(Date AS DATE), 'yyyy-dd-MM'):先将字符串日期转为DATE类型保证分组准确性,再格式化为你需要的YYYY-DD-MM格式作为JSON的键名。
  3. GROUP BY CAST(Date AS DATE):基于实际日期值分组,避免因为字符串格式差异导致的分组错误。
  4. WITHOUT_ARRAY_WRAPPER:用来去掉默认的数组包裹,让分组结果直接成为键值对形式的对象,最终组合成你想要的结构。

执行这个查询后,就能得到和你示例完全一致的JSON输出啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:26:05