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

将带列名的数据表转换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:28:48