我希望有人可以帮助我。我正试图在SQL Server 2005上调整一些数据,并且无法完全得到我正在寻找的结果。
这是我当前的表架构:
| ProductCode | AttributeName | AttributeValue |
| 1 | AttributeA | 10 |
| 1 | AttributeB | 20 |
| 2 | AttributeA | 30 |
| 2 | AttributeB | 40 |
| 3 | AttributeA | 50 |
这是我想要实现的结果:
| ProductCode | AttributeA | AttributeB |
| 1 | 10 | 20 |
| 2 | 30 | 40 |
| 3 | 50 | NULL |
我知道我可以使用以下SQL实现此结果:
SELECT DISTINCT ProductCode,
(SELECT AttributeValue
FROM attributes
WHERE ProductName = 'AttributeA' AND ProductCode=a.ProductCode) AttributeA,
(SELECT AttributeValue
FROM attributes
WHERE ProductName = 'AttributeB' AND ProductCode=a.ProductCode) AttributeB,
FROM attributes a
尽管SQL确实产生了我正在寻找的结果,但它显然不是动态的(实际上,我不仅拥有更多的属性类型,而且不同的产品具有不同的属性集),它还会扫描表3次。这也是一场维护噩梦。
我尝试使用SQL Server的PIVOT功能,但没有运气。
有人可以帮忙吗?
答案 0 :(得分:0)
create table #attributes (ProductCode int,
AttributeName varchar(20),
AttributeValue int)
insert into #attributes values (1, 'AttributeA', 10)
insert into #attributes values (1, 'AttributeB', 20)
insert into #attributes values (2, 'AttributeA', 30)
insert into #attributes values (2, 'AttributeB', 40)
insert into #attributes values (3, 'AttributeA', 50)
declare @attributes_columns nvarchar(max)
set @attributes_columns
= (
select ', [' + AttributeName + ']'
from
(
select distinct AttributeName as AttributeName
from #attributes
) t
order by t.AttributeName
for xml path('')
)
set @attributes_columns = stuff(@attributes_columns,1,2,'')
declare @sql nvarchar(max)
set @sql = N'
select ProductCode, <attributes_columns>
from
(select ProductCode, AttributeName, AttributeValue
from #attributes )p
pivot
(
sum(AttributeValue) for AttributeName in (<attributes_columns>)
) as pvt
'
set @sql = replace(@sql, '<attributes_columns>', @attributes_columns)
print @sql
exec sp_executesql @sql
drop table #attributes