如何使用 JSON 数组在 SQL Server 2016 中展平和转置混合表



我有一个表格,是这样的:

| f1 [int] | f2 [int] | jo1 [json object] | ja [json array] |

ja 是一个由多个 JSON 对象组成的数组,结构如下:

[
 {
  "ja_f1": x [int],
  "ja_f2": y [float]
 },
 ...
]

为了简单起见,我们假设 jo1 的结构也类似于 ja 中的对象

如何将其平展为单个记录?我正在尝试使它成为:

| f1 | f2 | jo1_f1 | jo1_f2 | ja[0]ja_f1 | ja[0]ja_f2 | ... | ja[n]ja_f2 |

我一直在 OPENJSON 上使用带有 CROSS APPLY 的光标来恢复丢失的数据,但它将其分解为多个部分,这不是我真正需要的。这是它的样子:

DECLARE @CursorForJSON CURSOR;

声明@JSON nvarchar(MAX);开始 设置 @CursorForJSON = 光标 选择JSON_Query(ja) 从我的表

OPEN @CursorForJSON
FETCH NEXT FROM @CursorForJSON
INTO @JSON
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT mt.f1 AS 'f1',
        ja_f1,
        ja_f2
    FROM OPENJSON( @json )
    WITH ( ja_f1 INT '$.ja_f1',
        ja_f2 FLOAT '$.ja_f2')
    CROSS APPLY mytable as mt
    GROUP BY mt.f1, ja_f1, ja_f2
    ORDER BY mt.f1 ASC;
    FETCH NEXT FROM @CursorForJSON
    INTO @JSON
END;
CLOSE @CursorForJSON ;
DEALLOCATE @CursorForJSON;
END;

任何指导将不胜感激

编辑:修复了伪代码中的一些错误

我从错误的角度处理这个问题,这就是我想做的......

SELECT mt.f1 AS 'f1',
    mt.f2 AS 'f2',
    JSON_VALUE(mt.jo1_f1,'$.jo_f1') AS 'jo f1',
    JSON_VALUE(mt.jo1_f2,'$.jo_f2') AS 'jo f2',
    j.ja_f1,
    j.ja_f2
FROM mytable mt
CROSS APPLY OPENJSON( mt.ja ) WITH (
        ja_f1 INT '$.ja_f1',
        ja_f2 FLOAT '$.ja_f2'
    ) j
GROUP BY mt.f1, mt.jo1_f1, mt.jo1_f2, j.ja_f1, j.ja_f2
ORDER BY mt.f1 ASC;

最新更新