生成包含多个对象的数组的对象,并添加总计JSON_QUERY

时间:2019-01-02 21:52:53

标签: json sql-server tsql

我正在尝试为每个客户获取一组发票对象,但是我遇到的错误是,当一个客户有多个发票时,将为该客户创建一个新对象,这是新发票。相反,我希望属于该客户的每个发票都在该客户的发票数据内。同样不确定如何将总的合并发票合并到“ clientInvoiceTotal”的外部对象,并合并所有来自“ invoiceTotal”属性的发票。

CREATE PROCEDURE get_report

@userId INT,
@year INT

AS

SELECT
JSON_QUERY((
    SELECT
        cl.client_name AS clientName,
        i.total AS clientInvoiceTotal,
        JSON_QUERY((
            SELECT
                i.invoice_id AS invoiceId,
                i.total AS invoiceTotal,
                JSON_QUERY((
                    SELECT
                        s.service_name AS serviceName,
                        cis.service_price AS invoiced
                    FROM
                        case_identifier_to_service cis
                        INNER JOIN services s ON s.service_id = cis.service_id
                    WHERE cis.invoice_id = i.invoice_id
                    FOR JSON PATH
                )) AS serviceData
                FROM invoices i WHERE i.invoice_id = c.invoice_id
            FOR JSON PATH
        )) AS clientData
    FROM
        cases c
        INNER JOIN clients cl ON cl.client_id = c.client_id
        INNER JOIN invoices i ON i.invoice_id = c.invoice_id
    WHERE c.user_id=@userId AND DATEPART(year, c.date_created) = @year
    FOR JSON PATH
)) AS report
FOR JSON PATH, WITHOUT_ARRAY_WRAPPER

应该返回的数据是:

{  
   "report":[  
      {  
         "clientName":"Client1",
         "clientInvoiceTotal":59500.00,
         "clientData":[  
            {  
               "invoiceId":100,
               "invoiceTotal":59500.00,
               "serviceData":[  
                  {  
                     "serviceName":"LDD",
                     "invoiced":59500.00
                  }
               ]
            }
         ]
      },
      {  
         "clientName":"Client2",
         "clientInvoiceTotal":53150.00,
         "clientData":[  
            {  
               "invoiceId":101,
               "invoiceTotal":8600.00,
               "serviceData":[  
                  {  
                     "serviceName":"BCP",
                     "invoiced":4900.00
                  },
                  {  
                     "serviceName":"BRS",
                     "invoiced":3700.00
                  }
               ]
            },
            {  
               "invoiceId":102,
               "invoiceTotal":44550.00,
               "serviceData":[  
                  {  
                     "serviceName":"DDBR",
                     "invoiced":44550.00
                  }
               ]
            }
         ]
      }
   ]
}

但是,相反,如果一个客户有多个发票,则会添加另一个具有重复客户名称的对象,我要返回的数据如下所示: INCORRECT

{  
   "report":[  
      {  
         "clientName":"Client1",
         "clientInvoiceTotal":59500.00,
         "clientData":[  
            {  
               "invoiceId":100,
               "invoiceTotal":59500.00,
               "serviceData":[  
                  {  
                     "serviceName":"LDD",
                     "invoiced":59500.00
                  }
               ]
            }
         ]
      },
      {  
         "clientName":"Client2",
         "clientInvoiceTotal":8600.00,
         "clientData":[  
            {  
               "invoiceId":101,
               "invoiceTotal":8600.00,
               "serviceData":[  
                  {  
                     "serviceName":"BCP",
                     "invoiced":4900.00
                  },
                  {  
                     "serviceName":"BRS",
                     "invoiced":3700.00
                  }
               ]
            }
         ]
      },
      {  
         "clientName":"Client2",
         "clientInvoiceTotal":44550.00,
         "clientData":[  
            {  
               "invoiceId":102,
               "invoiceTotal":44550.00,
               "serviceData":[  
                  {  
                     "serviceName":"DDBR",
                     "invoiced":44550.00
                  }
               ]
            }
         ]
      }
   ]
}

0 个答案:

没有答案