在 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 中将行显示为列的主要内容,如果未能解决你的问题,请参考以下文章