将带列名的数据表转换为JSON:SQL存储过程返回数据转换需求
看起来你是要把那种按指标行存储的SQL存储过程结果,转换成更结构化的JSON格式——也就是把同一个日期和办公室下的不同指标合并到同一个对象里,对吧?下面我给你两种常见的解决方案,按需选择:
方案1:在SQL Server中直接生成目标JSON(适合从存储过程直接输出JSON)
如果你的存储过程是基于SQL Server的,可以直接用动态SQL结合PIVOT和FOR JSON语法,把行式的指标数据转成结构化JSON。这样不需要额外的代码处理,直接从数据库拿到想要的结果。
实现代码
DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX) -- 第一步:获取所有唯一的Metric_Name,用来构建PIVOT的列 SELECT @cols = STRING_AGG(QUOTENAME(Metric_Name), ',') FROM (SELECT DISTINCT Metric_Name FROM YourTable) t -- 第二步:构建动态SQL,先把每个指标的属性打包成JSON子对象,再PIVOT转成列,最后整体转JSON SET @sql = N' SELECT Date, Office_ID, ' + @cols + ' FROM ( SELECT Date, Office_ID, Metric_Name, JSON_QUERY(( SELECT Actual_Value, Goal_Value, Actual_Percent, Goal_Percent, Actual_Points, Goal_Points FOR JSON PATH, WITHOUT_ARRAY_WRAPPER )) AS MetricData FROM YourTable ) src PIVOT ( MAX(MetricData) FOR Metric_Name IN (' + @cols + ') ) pvt FOR JSON PATH' -- 执行动态SQL EXEC sp_executesql @sql
说明
STRING_AGG用来把所有唯一的指标名拼接成PIVOT需要的列列表(比如[Hours_Worked],[Projects_Worked])JSON_QUERY把每个指标的实际值、目标值等字段打包成一个JSON子对象,避免转义问题- 最后用
FOR JSON PATH把整个结果集转成标准JSON数组
方案2:拿到结果集后用代码转换(以Python为例)
如果更倾向于在应用层处理数据,拿到存储过程返回的行式数据后,可以用代码按Date和Office_ID分组,把每个指标整理成对象的属性。
实现代码
import json # 假设这是从存储过程获取到的原始数据(和你给出的示例结构一致) raw_data = [ { "Date": "2018-04-30", "Office_ID": "0001", "Metric_Name": "Hours_Worked", "Actual_Value": "25", "Goal_Value": "100", "Actual_Percent": "25%", "Goal_Percent": "50%", "Actual_Points": "1", "Goal_Points": "5" }, { "Date": "2018-04-30", "Office_ID": "0001", "Metric_Name": "Projects_Worked", "Actual_Value": "5", "Goal_Value": "10", "Actual_Percent": "50%", "Goal_Percent": "75%", "Actual_Points": "3", "Goal_Points": "4" } ] # 整理成结构化JSON的逻辑 structured_data = {} for item in raw_data: # 提取分组键和指标名 date_key = item["Date"] office_key = item["Office_ID"] metric_key = item["Metric_Name"] # 提取当前指标的属性(排除分组用的字段) metric_details = {k: v for k, v in item.items() if k not in ["Date", "Office_ID", "Metric_Name"]} # 按日期、办公室层级分组 if date_key not in structured_data: structured_data[date_key] = {} if office_key not in structured_data[date_key]: structured_data[date_key][office_key] = {} structured_data[date_key][office_key][metric_key] = metric_details # 转成格式化的JSON字符串 final_json = json.dumps(structured_data, indent=4) print(final_json)
输出结果
运行后会得到这样的结构化JSON:
{ "2018-04-30": { "0001": { "Hours_Worked": { "Actual_Value": "25", "Goal_Value": "100", "Actual_Percent": "25%", "Goal_Percent": "50%", "Actual_Points": "1", "Goal_Points": "5" }, "Projects_Worked": { "Actual_Value": "5", "Goal_Value": "10", "Actual_Percent": "50%", "Goal_Percent": "75%", "Actual_Points": "3", "Goal_Points": "4" } } } }
如果是用C#、Java等其他语言,核心思路都是一样的:按日期和办公室分组,将每个指标名作为键,对应的属性集合作为值,最后序列化为JSON即可。
内容的提问来源于stack exchange,提问作者user8296539
相关产品推荐
相关产品推荐

