Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将存储过程的结果分组为JSON-Azure SQL_Sql_Sql Server - Fatal编程技术网

将存储过程的结果分组为JSON-Azure SQL

将存储过程的结果分组为JSON-Azure SQL,sql,sql-server,Sql,Sql Server,我有一个存储过程,它返回的数据大致是这种格式 ID | Field1 | Field2 | Group | Description ------------------------------------------------ 1 | A | A | g1 | g1A description 1 | A | A | g2 | g2A description 2 | B | B | g1 | g1B

我有一个存储过程,它返回的数据大致是这种格式

ID | Field1 | Field2 | Group  | Description
------------------------------------------------
1  |   A    |   A    |   g1   |  g1A description
1  |   A    |   A    |   g2   |  g2A description
2  |   B    |   B    |   g1   |  g1B description
2  |   B    |   B    |   g2   |  g2B description
3  |   C    |   C    |   g1   |  g1C description
3  |   C    |   C    |   g2   |  g2C description


SELECT
  a.ID,
  a.Field1,
  b.Field2,
  c.Group,
  c.Description
FROM A as a
  INNER JOIN B b ...
  INNER JOIN C c ...
在代码中,我将数据集转换为JSON

[
  {
    ID: 1,
    Field1: A,
    Field2: A,
    Groups: {
      g1: g1A description,
      g2: g2A description,
    }
  }, {
    ID: 2,
    Field1: B,
    Field2: B,
    Groups: {
      g1: g1B description,
      g2: g2B description,
    }
  }, {
    ID: 1,
    Field1: C,
    Field2: C,
    Groups: {
      g1: g1C description,
      g2: g2C description,
    }
  }
]
我不喜欢该过程在每一行中返回的数据大多是重复的。是否有某种方法可以在SQL中执行分组,以便返回的数据集类似于

ID | Field1 | Field2 | Groups  
------------------------------------------------
1  |   A    |   A    | 'Groups: { g1: g1A description, g2: g2A description }'
2  |   B    |   B    | 'Groups: { g1: g1B description, g2: g2B description }'
3  |   C    |   C    | 'Groups: { g1: g1C description, g2: g2C description }'


根据D-Shih的回答,我得出了以下结论:

   SELECT
       a.ID,
       a.Field1,
       b.Field2,
       (
         SELECT 
           MAX(CASE WHEN [Group] = 'g1' THEN Description END) g1, 
           MAX(CASE WHEN [Group] = 'g2' THEN Description END) g2
         FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
       ) as Groups
   FROM A as a
      INNER JOIN B b ...
      INNER JOIN C c ...


    ID | Field1 | Field2 | Groups  
   ------------------------------------------------
    1  |   A    |   A    | '{ "g1": "g1A description", "g2": "g2A description" }'
    2  |   B    |   B    | '{ "g1": "g1B description", "g2": "g2B description" }'
    3  |   C    |   C    | '{ "g1": "g1C description", "g2": "g2C description" }'

您的第二个预期结果可以使用条件聚合函数来实现

SELECT ID,
      Field1,
      Field2,
      MAX(CASE WHEN [Group] = 'g1' THEN Description END) g1, 
      MAX(CASE WHEN [Group] = 'g2' THEN Description END) g2
FROM T
GROUP BY ID,Field1,Field2

注意


T
是您当前的结果集。

您不能在查询中使用存储过程的结果。如果要这样做,需要将其转换为函数。如果您想生成JSON,为什么不编写一个不同的查询来使用它呢?您使用的是哪个SQL Server版本?在SQL Server 2016及更高版本中,您只需为JSON AUTO添加
,即可获得结果嵌套在每个表中的JSON字符串,或为JSON PATH添加
,即可通过列指定嵌套names@PanagiotisKanavos我使用的是Azure SQL,因此我可以访问JSON功能
SELECT ID,
      Field1,
      Field2,
      MAX(CASE WHEN [Group] = 'g1' THEN Description END) g1, 
      MAX(CASE WHEN [Group] = 'g2' THEN Description END) g2
FROM T
GROUP BY ID,Field1,Field2