需要帮助转动一些数据

时间:2011-10-20 19:59:59

标签: sql-server sql-server-2005 tsql pivot

我希望有人可以帮助我。我正试图在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功能,但没有运气。

有人可以帮忙吗?

1 个答案:

答案 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