如何通过SQL构建按颜色分组嵌套尺寸的聚合JSON对象
实现说明
这个需求完全可以实现,根据你使用的数据库版本选择对应方案即可,不需要做复杂的二次开发。
方案1:SQL Server 2016及以上版本(推荐,数据库层直接输出目标JSON)
SQL Server 2016开始原生支持FOR JSON语法,可以直接构造多层嵌套的JSON结构,和你需要的目标格式完全匹配,核心逻辑是按「商品→颜色→尺寸库存」三层逐级嵌套聚合。
直接执行下面的SQL就能拿到符合要求的JSON结果:
SELECT stokkodu, adi, afiyat, -- 嵌套构造当前商品下的颜色分组 ( SELECT renk, -- 嵌套构造当前颜色下的尺寸库存列表 ( SELECT beden, SUM(kalan) AS kalan FROM [viabase].[dbo].[Q_KALANS] s WHERE s.stokkodu = c.stokkodu AND s.renk = c.renk GROUP BY s.beden FOR JSON PATH ) AS bedenler FROM ( SELECT DISTINCT stokkodu, renk FROM [viabase].[dbo].[Q_KALANS] ) c WHERE c.stokkodu = p.stokkodu FOR JSON PATH ) AS renkler FROM ( SELECT DISTINCT stokkodu, adi, afiyat FROM [viabase].[dbo].[Q_KALANS] ) p FOR JSON PATH, ROOT('urunler')
说明:上面SQL里的
bedenler(尺寸列表)、renkler(颜色列表)、urunler(商品根节点)均和目标JSON格式的key对齐,如果需要调整字段名直接修改对应别名即可。
方案2:低版本SQL Server(不支持原生JSON语法)
如果你的数据库版本低于2016,先执行你已经写好的平铺查询语句,把结果取到应用层之后按两层分组做聚合即可:
- 第一步先按
stokkodu(商品编码)分组,把相同商品的记录归到同一个商品节点下,填充商品编码、名称、价格属性 - 第二步在每个商品节点下,再按
renk(颜色)分组,把相同颜色的记录归到同一个颜色节点下 - 最后在每个颜色节点下,把对应记录的
beden(尺寸)、kalan(库存)整理成数组
聚合完成后把结构序列化成JSON返回给客户端即可,逻辑简单,所有后端语言都能快速实现。
内容的提问来源于stack exchange,提问作者whitehead421
相关产品推荐
相关产品推荐

