我有一个表:InvoiceDisputesApprovalResult,其中包含工作流. 它的列是:disputeID、ApproverEmail、Status、ApprovalLevel和ClaimID

例如,索赔ID=3423和争议ID=3123123具有以下内容:

disputeId  |approverEmail           |status  |approvalLevel|claimId
3123123    |approver1@mailinator.com|waiting |1            |3423 
3123123    |approver2@mailinator.com|waiting |2            |3423 
3123123    |approver3@mailinator.com|waiting |3            |3423 

因此,有争议的ID 3123123有3个批准级别.

所需的JSON输出:所需的结果是获得此JSON(对于ClaimID 3423,应该是)

{   "claimId":  3423 ,  "disputeId":    3123123 ,   "disputeType": "CREAR_NC",  "status": "OK",  "description" : "Aprobador",   "approvers": [  {   "mail": "approver1@mailinator.com", "approvalLevel":    1   },{ "mail": "approver2@mailinator.com", "approvalLevel":    2   },{ "mail": "approver3@mailinator.com", "approvalLevel":    3   }], "pvp":  null    ,"salePrice":   null    ,"saleMKUP":    null    ,"claimMKUP":   null    ,"mktope":  null    ,"mkcliete":    null    }

注:

Values: "disputeType": "CREAR_NC",  "status": "OK",  "description" : "Aprobador", "pvp":    null    ,"salePrice":   null    ,"saleMKUP":    null    ,"claimMKUP":   null    ,"mktope":  null    ,"mkcliete":    null are harcoded. 你明白我的意思吗?

另一个例子是存在争议ID=221322

disputeId |approverEmail           |status  |approvalLevel|claimId
221322    |approver1@mailinator.com|waiting |1            |2323
221322    |approver2@mailinator.com|waiting |2            |2323

但在本例中,它只有2个ApprovalLevel.

期望的结果是获得此JSON(对于ClaimID 2323,它应该是)

{   "claimId":  2323,   "disputeId":    221322, "disputeType": "CREAR_NC",  "status": "OK",  "description" : "Aprobador",   "approvers": [  {   "mail": "approver1@mailinator.com", "approvalLevel":    1   },{ "mail": "approver2@mailinator.com", "approvalLevel":    2   }], "pvp":  null    ,"salePrice":   null    ,"saleMKUP":    null    ,"claimMKUP":   null    ,"mktope":  null    ,"mkcliete":    null    }

同样,值:"conpositteType":"CREAR_NC","Status":"OK","Description":"Aproador","pvp":NULL,"salePrice":NULL,"saleMKUP":NULL,"CLUMKUP":NULL,"mkope":NULL,"mkcliete":NULL.

你明白我的意思吗?

我试过这样的方法:

SELECT
    main.claimId,
    main.disputeId,
    'CREAR_NC' AS disputeType,
    'OK' AS status,
    'Aprobador' AS description,
    (
        SELECT
            '[' + STUFF(
                (
                    SELECT
                        ', ' + (
                            SELECT '{"mail": "' + sub.approverEmail + '", "approvalLevel": ' + CAST(sub.approvalLevel AS VARCHAR) + '}'
                            FOR XML PATH(''), TYPE
                        ).value('.', 'VARCHAR(MAX)')
                    FROM InvoiceDisputesApprovalResult AS sub
                    WHERE sub.claimId = main.claimId
                    and main.disputeId = 28258
                    FOR XML PATH('')
                ), 1, 2, ''
            ) + ']'
    ) AS approvers,
    NULL AS pvp,
    NULL AS salePrice,
    NULL AS saleMKUP,
    NULL AS claimMKUP,
    NULL AS mktope,
    NULL AS mkcliete
FROM InvoiceDisputesApprovalResult AS main
WHERE main.status = 'WAITING'
  AND main.disputeId = 28258 
GROUP BY main.claimId, main.disputeId;

问题是我得到了许多不属于给定争议ID的审批者

claimId              disputeId            disputeType status description approvers                                                                                                                                                                                                                                                        pvp         salePrice   saleMKUP    claimMKUP   mktope      mkcliete

(1行受影响)

推荐答案

这是一种更好的方法,不需要将disputeId传递给"Stuff"函数:

SELECT
    main.claimId,
    main.disputeId,
    'CREAR_NC' AS disputeType,
    'OK' AS status,
    'Aprobador' AS description,
    (
        SELECT
            '[' + STUFF(
                (
                    SELECT
                        ', ' + (
                            SELECT '{"mail": "' + sub.approverEmail + '", "approvalLevel": ' + CAST(sub.approvalLevel AS VARCHAR) + '}'
                            FOR XML PATH(''), TYPE
                        ).value('.', 'VARCHAR(MAX)')
                    FROM InvoiceDisputesApprovalResult AS sub
                    WHERE sub.claimId = main.claimId 
                          and sub.disputeId = main.disputeId 
                    FOR XML PATH('')
                ), 1, 2, ''
            ) + ']'
    ) AS approvers,
    NULL AS pvp,
    NULL AS salePrice,
    NULL AS saleMKUP,
    NULL AS claimMKUP,
    NULL AS mktope,
    NULL AS mkcliete
FROM InvoiceDisputesApprovalResult AS main
WHERE main.status = 'waiting' 
      AND main.disputeId = 3123123 
GROUP BY main.claimId, main.disputeId;

Demo here

Sql相关问答推荐

无法找到正确的SQL查询需求

PostgreSQL中的合并命令是原子的,还是需要一些类似于SQL Server版本的内容?

SQL:如何在表中同时使用GROUPING和CONDITION?

从数据库中查找总和大于或等于查询中的数字的数字

SQL按日期分组字段和如果日期匹配则求和

将FLOAT转换为VARBINARY,然后再转换回FLOAT

将JSON文件导入Postgres 16数据库时出错(22P04上次预期列之后的额外数据)

MS Access问题查询中的自定义字段

按两列分组,并根据SQL中的条件返回第三个列值

如何根据几个条件 Select 值:如果满足一个范围的SUM,则对另一个范围求和

将时间范围划分为全天和前后剩余小时

根据标识符将两行合并为一行

如何根据 SQL 中的阈值标记一个集群中的所有值?

使用 XML 作为 SQL 表

除了风格之外,还有什么理由更喜欢简单的CASE WHEN而不是搜索呢?

如何将 START 和 END 日期之间的日期差异作为 SQL 中的单独列获取

Oracle SQL:通过将日期与另一个表行进行比较来 Select 值

避免在SQL中使用具有相同条件的多个子查询

COBOL\DB2作业(job)需要帮助?快来获取专业指导!

基于源表的 SQL INSERT、UPDATE 和 DELETE