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
代码解释
- 内层子查询:负责按日期分组,为每个日期生成对应的
Name数组,用FOR JSON PATH输出[{"Name": "xxx"}, ...]的数组格式。 FORMAT(CAST(Date AS DATE), 'yyyy-dd-MM'):先将字符串日期转为DATE类型保证分组准确性,再格式化为你需要的YYYY-DD-MM格式作为JSON的键名。GROUP BY CAST(Date AS DATE):基于实际日期值分组,避免因为字符串格式差异导致的分组错误。WITHOUT_ARRAY_WRAPPER:用来去掉默认的数组包裹,让分组结果直接成为键值对形式的对象,最终组合成你想要的结构。
执行这个查询后,就能得到和你示例完全一致的JSON输出啦!
内容的提问来源于stack exchange,提问作者EddyLee
相关产品推荐
相关产品推荐

