2011-10-20 15 views
1

私は誰かが私を助けることを望んでいます。私はSQL Server 2005でいくつかのデータをピボットしようとしており、私が探している結果を得ることができません。いくつかのデータをピボットする手助けが必要

これは私の現在のテーブルのスキーマです:私は、次のSQLを使用して、この結果を達成することができることを知っている

| ProductCode | AttributeA | AttributeB | 
| 1   | 10   | 20   | 
| 2   | 30   | 40   | 
| 3   | 50   | NULL  | 

を::

| ProductCode | AttributeName | AttributeValue | 
| 1   | AttributeA | 10    | 
| 1   | AttributeB | 20    | 
| 2   | AttributeA | 30    | 
| 2   | AttributeB | 40    | 
| 3   | AttributeA | 50    | 

これは私が達成しようとしている結果である

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 

私が探している結果が得られますが、それは明らかに動的ではありません(実際は、私はより多くの属性タイプを持っているだけでなく、異なる製品は属性の異なるセットを持っています)また、テーブルを3回スキャンします。それはメンテナンスの悪夢でもあります。

私はSQL ServerのPIVOT機能を使用しようとしましたが、運はありませんでした。

誰でも手助けできますか?

答えて

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 
+0

ありがとうございました!私はこれをプラグインして、2つのランタイムエラーを除いて、うまくいった:(1)挿入と(2)宣言されたときにローカル変数を初期化する。私はSQL2005を使用しているので、私はそれが理由だと推測しています。あなたはテーブル機能の中でこのロジックを使う方法を知っていますか?私はそれと一緒に遊んで、それは非常に動的なので、私はそれがテーブルの機能と(したがってSPでなければならない)とは思えない。 SPの欠点は、私がそれに加わることができないことです。もう一度、ありがとう! – pdalbe01

+0

ようこそ、申し訳ありませんが、SQL2005でそれをテストしていませんでした。私は –

+0

を修正しました。 "インラインテーブル値関数では、TABLE戻り値は単一のSELECT文で定義されています。 http://msdn.microsoft.com/en-us/library/ms186755.aspx –

関連する問題