编写SQL查询:将同一car_id的参数合并至同一列
解决方案:合并同一car_id的参数记录到单列
原表结构与数据
| car_id | car_model | car_lot | spec_name | displayMin | displayMax | state |
|---|---|---|---|---|---|---|
| 102 | Toyota | 2 | Battery | 100 | 1 | 1 |
| 102 | Toyota | 2 | Engine | 1000 | 25 | 1 |
| 102 | Toyota | 2 | Oil | 90 | 9 | 1 |
| 103 | BMW | 2 | Engine | 2000 | 50 | 1 |
| 103 | BMW | 2 | Throttle | 20 | 5 | 0 |
| 103 | BMW | 2 | Battery | 100 | 10 | 0 |
期望结果
| car_id | car_model | car_lot | car_params |
|---|---|---|---|
| 102 | Toyota | 2 | params {(Battery:100,1,1), (Engine:1000,25,1),(Oil:90,9,1)} |
| 103 | BMW | 2 | params {(Engine:2000,50,1), (Throttle:20,5,0),(Battery:100,10,0)} |
正确SQL查询(适用于Azure SQL Database/SQL Server)
INTERSECT用于筛选两个查询的交集结果,完全不适合当前的行合并场景,所以无法得到正确结果。针对Azure环境,推荐使用STRING_AGG函数实现行转列的合并操作:
SELECT car_id, car_model, car_lot, CONCAT('params {', STRING_AGG(CONCAT('(', spec_name, ':', displayMin, ',', displayMax, ',', state, ')'), ', '), '}') AS car_params FROM cars GROUP BY car_id, car_model, car_lot
代码说明
- 单条参数拼接:用
CONCAT把spec_name、displayMin、displayMax、state拼接成(Battery:100,1,1)格式的字符串 - 分组合并:通过
GROUP BY按car_id、car_model、car_lot分组,再用STRING_AGG将同一组内的参数字符串用,分隔合并 - 添加前后缀:最后用
CONCAT加上params {前缀和}后缀,得到期望的car_params格式
如果你的环境使用MySQL,可替换为GROUP_CONCAT函数,语法调整如下:
SELECT car_id, car_model, car_lot, CONCAT('params {', GROUP_CONCAT(CONCAT('(', spec_name, ':', displayMin, ',', displayMax, ',', state, ')') SEPARATOR ', '), '}') AS car_params FROM cars GROUP BY car_id, car_model, car_lot
该查询可直接用于Azure Logic Apps的循环处理,返回的每条记录对应一个car_id的完整参数集合。
内容的提问来源于stack exchange,提问作者Need Help
相关产品推荐
相关产品推荐

