在 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)
我有两个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)