我在 SQL Server 中有一个简单的表,如下所示。
CREATE TABLE chemical(
[chemical] [varchar](10) NULL,
[region] [varchar](10) NULL,
[asset] [varchar](10) NULL
) ON [PRIMARY]
插入:
INSERT INTO chemical ([chemical],[region],[asset]) VALUES ('a','region1','asset1')
INSERT INTO chemical ([chemical],[region],[asset]) VALUES ('a','region2','asset1')
INSERT INTO chemical ([chemical],[region],[asset]) VALUES ('a','region1','asset2')
数据将如下所示:
化学 | 地区 | 资产 |
---|---|---|
a | 地区1 | 资产1 |
a | 区域2 | 资产1 |
a | 地区1 | 资产2 |
我想将信息旋转为:
化学 | 信息 |
---|---|
a | region1_asset1、region1_asset2、region2_asset1 |
我尝试使用 PIVOT 功能,但无法使其工作。
这通常是
STRING_AGG
的一个很好的用例,请参阅有关该功能的文档。
我们只需要处理一些重要的事情即可确保结果达到预期:
GROUP BY
子句才能仍然获得正确的结果。CONCAT
来实现这一点。ORDER BY
中使用 STRING_AGG
子句(至少根据您的示例数据,否则忽略这一点)。所以整个查询将是这个:
SELECT
chemical,
STRING_AGG(CONCAT(region,'_',asset),', ')
WITHIN GROUP (ORDER BY region) AS Info
FROM chemical
GROUP BY chemical
ORDER BY chemical;
请参阅此小提琴示例,基于您的示例数据,但还有一些其他化学物质可以说明为什么要添加
GROUP BY
子句。
显示由上述查询的
ORDER BY region
部分引起的差异:
这个结果...
region1_asset2, region1_asset1, region2_asset1
...无需订购就是这个:
region1_asset1, region2_asset1, region1_asset2
这也显示在小提琴中。