将存储过程的结果分组为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