在 SQL 中显示行到列

Display row into column in SQL

我有两个SQLTable

第一个 Table 名称:- AttributeType

ID Name
1 Name
2 Address
3 Amount

第二个 Table 名称:- AttributeValue

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

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

输出将是 输出table

ID Name Address Amount
1 John Ohio,USA 500$

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

提前致谢。

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

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 table 中似乎有一个类型。为了让它起作用,给定人的所有 ID 值都应该具有相同的值。在这种情况下,所有三个示例记录的 ID 值都应为 1。

我对上面给出的数据进行了一些修改。您的 Table 列名称和值相同,这在使用旋转逻辑时会出现问题。所以我改变了它。使用 rownumber 间接获取的 ID id。如果我们使用 table 中提供的 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)