在 SQL 中将行显示为列

Posted

技术标签:

【中文标题】在 SQL 中将行显示为列【英文标题】:Display row into column in SQL 【发布时间】:2021-11-24 14:27:28 【问题描述】:

我有两个 SQL 表

第一个表名称:- AttributeType

ID Name
1 Name
2 Address
3 Amount

第二个表名:- AttributeValue

ID AttributeId Value
1 1 John
2 2 Ohio,USA
3 3 500$

我想合并这两个表并与其他表连接,列名将按属性类型表中的值显示(如果有 5 行,输出表中将显示 5 列)

输出将是 输出表

ID Name Address Amount
1 John Ohio,USA 500$

我不知道如何编写查询 谁能帮帮我?

提前致谢。

【问题讨论】:

如果您不知道如何编写查询,那么您真的需要一个教程。这个网站是为了在你遇到困难时帮助你。不是为您编写整个查询。 对于AttributeValue 表的所有 3 条记录,您应该拥有 ID = 3 这能回答你的问题吗? SQL Server dynamic PIVOT query? 【参考方案1】:

我对上面给出的数据添加了一些更改。您的表列名称和值是相同的,这是使用透视逻辑时的问题。所以我改变了它。 ID id 使用 rownumber 间接获取。如果我们使用表中提供的 id,它不会给你正确的结果。

create table AttributeType
(ID int
,[AttName] varchar(100) --Changed to [AttName]
)
insert into AttributeType values  (1, 'Name')
 ,(2,'Address')
 ,(3, 'Amount')

Create table AttributeValue
(
 ID int 
, AttributeId int
, [Value] varchar(100)
)
insert into AttributeValue values (1,1,'John')
,(2,2, 'Ohio,USA')
,(3,3, '500$')


 SELECT 
 ROW_NUMBER() OVER (ORDER BY [Name]) as ID ,[Name], address, Amount FROM
 (

 SELECT
  [a].[AttName] 
  ,[av].[Value]
 FROM AttributeValue av
 INNER JOIN AttributeType [a]
    ON a.ID = av.AttributeId

   ) as [sourceTable]
   PIVOT
    (
     MAX([sourceTable].[Value] ) FOR  [sourceTable].[AttName]  IN ([Name], [Address],[Amount])
     ) AS pivoted

动态方法

  DECLARE @cols AS NVARCHAR(MAX),
  @query  AS NVARCHAR(MAX);

  SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(a.[AttName]) 
        FROM  AttributeType [a]
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

     set @query = 'SELECT ROW_NUMBER() OVER (ORDER BY [Name]) as ID , ' + @cols + ' from 
          (
            SELECT
             [a].[AttName]   
             ,[av].[Value]
            FROM AttributeValue av
                INNER JOIN AttributeType [a]
                 ON a.ID = av.AttributeId
       ) as [sourceTable]
        pivot 
        (
            MAX([sourceTable].[Value] ) FOR
            [sourceTable].[AttName] in (' + @cols + ')
        ) as pivoted '


   execute(@query)

【讨论】:

@poojashah 如果你需要这个动态,让我知道我在这里为动态方法添加代码。我使用了静态查询,因为目前您的属性很少。 我需要动态方法。将来会添加新的属性类型,我不想在那个时候更改查询 @poojashah 根据您的要求添加了动态枢轴。如果您需要进一步的支持,请查看并告诉我。乐于助人:) @poojashah 你也可以给我投票吗?【参考方案2】:

我们可以在这里使用旋转逻辑:

SELECT
    av.ID,
    MAX(CASE WHEN at.Name = 'Name'    THEN av.Value END) AS Name,
    MAX(CASE WHEN at.Name = 'Address' THEN av.Value END) AS Address,
    MAX(CASE WHEN at.Name = 'Amount'  THEN av.Value END) AS Amount
FROM AttributeValue av
INNER JOIN AttributeType at
    ON at.ID = av.AttributeId
GROUP BY
    av.ID;

注意:您的AttributeValue 表中似乎有一个类型。为了使它起作用,给定人的所有ID 值应该具有相同的值。在这种情况下,所有三个样本记录的 ID 值都应为 1。

【讨论】:

我需要动态查询,如果在属性类型表中添加新类型,则时间查询会自动在输出表中添加新列。 使用常规 SQL 无法做到这一点,您需要动态 SQL(即自身生成 SQL 查询的代码)。

以上是关于在 SQL 中将行显示为列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中将行转换为列值 [关闭]

在 SQL 中将行转置为列标题

如何在sql中将行转换为列

如何在 MySQL 中将行数据转置为列

在 Spark SQL (pyspark) 中将行转置为列

在 SQL 中将分隔的行拆分为列