使用文本列透视 SQL 表[重复]

问题描述 投票:0回答:1

我在 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 功能,但无法使其工作。

sql sql-server pivot
1个回答
0
投票

这通常是

STRING_AGG
的一个很好的用例,请参阅有关该功能的文档

我们只需要处理一些重要的事情即可确保结果达到预期:

  • 虽然您的样本数据仅包含一种化学物质的数据,但当表中出现更多化学物质时,我们肯定需要一个
    GROUP BY
    子句才能仍然获得正确的结果。
  • 我们需要将“region”和“asset”列放在一起,并在它们之间使用下划线。我们可以使用
    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

这也显示在小提琴中。

© www.soinside.com 2019 - 2024. All rights reserved.