下面的代码打开一个json内容,并在最后对其进行透视.不知何故,排序/旋转搞错了.

WITH request
as
(
    SELECT requestId,
           property1191,
           '['+replace(replace(property1191, '[', ''), ']', '')+']' as json
    from capex_management_requests
)
SELECT *
FROM
(
    SELECT
      P.requestId,
      AttsData.[Id],
      AttsData.[data],
      ROW_NUMBER() OVER (PARTITION BY P.requestId, AttsData.[Id]
                     ORDER BY (SELECT 1) ) AS row_id
    FROM request P
    CROSS APPLY OPENJSON (P.json, N'$') 
      WITH 
      (
        Id VARCHAR(200) N'$.metaId',
        data VARCHAR(200) N'$.data'
      ) AS AttsData
) DS
PIVOT 
(
     MAX(data) FOR Id IN ([690], [1192])
) piv;

JSON example

{"metaId":690,"data":"1"},{"metaId":1192,"data":"4352"}\],\[{"metaId":690,"data":"2"},{"metaId":1192,"data":"3887"}\],\[{"metaId":690,"data":"3"},{"metaId":1192,"data":"4372"}\],\[{"metaId":690,"data":"4"},{"metaId":1192,"data":"3749"}\],\[{"metaId":690,"data":"51"},{"metaId":1192,"data":"3693"}\],\[{"metaId":690,"data":"51"},{"metaId":1192,"data":"3712"}\],\[{"metaId":690,"data":"89"},{"metaId":1192,"data":"4228"}

Current results - wrong ordering(例如,690:1应显示1192:4352)

requestId row_id 690 1192
1 7 1 4228
1 6 2 3712
1 5 3 3693
1 4 4 3749
1 2 51 3887
1 3 51 4372
1 1 89 4352

Target - correct ordering(未显示row_id)

requestId row_id 690 1192
1 x 1 4352
1 x 2 3887
1 x 3 4372
1 x 4 3749
1 x 51 3693
1 x 51 3712
1 x 89 4228

我对根据JSON语法的正确排序感兴趣

推荐答案

排序因您使用(SELECT NULL)而混乱. 要获得正确的排序,您需要使用OPENJSON的"EDGE"版本,如下所示:

declare @json nvarchar(max) = N'{"metaId":690,"data":"1"},{"metaId":1192,"data":"4352"}\],\[{"metaId":690,"data":"2"},{"metaId":1192,"data":"3887"}\],\[{"metaId":690,"data":"3"},{"metaId":1192,"data":"4372"}\],\[{"metaId":690,"data":"4"},{"metaId":1192,"data":"3749"}\],\[{"metaId":690,"data":"51"},{"metaId":1192,"data":"3693"}\],\[{"metaId":690,"data":"51"},{"metaId":1192,"data":"3712"}\],\[{"metaId":690,"data":"89"},{"metaId":1192,"data":"4228"}'
;WITH request
as
(
    SELECT 1 requestId,
           'test' property1191,
           '['+replace(replace(@json, '\[', ''), '\]', '')+']' as json
)
SELECT *
FROM
(
    SELECT  P.requestId
    ,   JSON_VALUE(AttsData.value, '$.metaId') as id
    ,   JSON_VALUE(AttsData.value, '$.data') as data
    ,   ROW_NUMBER() OVER (PARTITION BY P.requestId, JSON_VALUE(AttsData.value, '$.metaId') ORDER BY CAST(attsdata.[key] AS INT)) AS row_id
    FROM request P
    CROSS APPLY OPENJSON (P.json)  AttsData
) DS
PIVOT 
(
     MAX(data) FOR Id IN ([690], [1192])
) piv;

Sql相关问答推荐

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

如何解决Error:operator is not unique:unknown—unknown在一个动态SQL查询?""""

Select 最大值,但当并列时,从其他列 Select 最大值

使用sede获取不一定有两个不同标签的所有问题

从原始表列中经过JSON字符串化的对象数组构建视图

查询每周数据(周一至周日),避免年度日期重叠

缺少日期标识

如何为该查询编写正确分区依据

嵌套Json对象的SQL UPDATE WHERE

SQL将三个表中的三列组合为一列

Select 最频繁的值以及分组依据

如何在Hive SQL中分别按多列进行分组?

如何在 SQL Server 中解决这个复杂的窗口查询?

将时间戳四舍五入到最近 10 分钟的查询

将空 JSON 数组添加到 SQL Server 表列中的 JSON 字符串

获取上个月和上一年的值

如何使用SELECT语句进行左连接,并根据右表中的特定值过滤结果?

按所选的值将记录分组到不同的列中

如何从一张表中获取值在至少三行相同的记录

如何仅在满足条件时才按顺序在 SQL 中计数?