2017-09-11 7 views
0

に行を変換する私は、サンプルテーブルの下に列のSQL Serverの

month year budget_Amt Actual_Amt 
feb  2017  25   30 
mar  2016  10   5 
apr  2016  50   15 

私の出力は次のようにする必要がありますしている:SQLのクエリーだろう

month year Budget_Amt Actual_amt Budget_Amt1 Actual_amt1 Budget_Amt2 Actual_Amt2 
Feb 2017 25   30   null   null  null  null 
mar 2016 null  null   10   5   null  null 
apr 2016 null  null   null   null  50  15 

何?

+1

をheplsを願っています(SQL Serverの(タイトルが示すように)またはMySQLを使用していますタグが示唆したように)?適切なタグを付けてください。 –

+2

["行を列SQL Serverに変換する]"(https://stackoverflow.com/search?q=Convert+rows+To+Column+SQL)を検索すると返される他の1,118の結果を調べましたか? +サーバー)のStackoverflow? – GarethD

答えて

0

これはピボットを使用して行われませんが、目的の結果が得られます。そして、あなたは列名を宣言する必要はありません、それは動的な列を持つことができます。上記のシナリオでテストされています。あなたがあなたのテーブル
Cross join 2時間を使うことができ

create table #testdata(id int ,month varchar(10), year int, budget_Amt int null, Actual_Amt int null) 

insert into #testdata(id, month , year, budget_Amt, Actual_Amt) 
values(1,'feb',  2017,  25,   30), 
(2, 'mar',  2016,  10,   5), 
(3, 'apr',  2016,  50,   15) 

declare @count int 
declare @budget_Amt varchar(500) = '' 
declare @Actual_Amt varchar(500) = '' 

select @count = COUNT(*) from #testdata 
declare @i int = 0 
while @i < @count 
begin 
    if(@i = 0) 
    begin 
     select @budget_Amt = 'budget_Amt' + ' int null, ' 
     select @Actual_Amt = 'Actual_Amt' + ' int null, ' 
     set @i = @i + 1 
    end 
    else 
    begin 
    set @i = @i + 1 
    if(@i = @count) 
    begin 
    select @budget_Amt = @budget_Amt + 'budget_Amt' + convert(varchar(10),@i-1) + ' int null ' 
    select @Actual_Amt = @Actual_Amt + 'Actual_Amt' + convert(varchar(10),@i-1) + ' int null ' 
    end 
    else 
    begin 
    select @budget_Amt = @budget_Amt + 'budget_Amt' + convert(varchar(10),@i-1) + ' int null, ' 
    select @Actual_Amt = @Actual_Amt + 'Actual_Amt' + convert(varchar(10),@i-1) + ' int null, ' 
    end end 
end 

declare @createQuery as nvarchar(500) set @createQuery = 'create table ##temp(month varchar(10), year int,' + @budget_Amt + ',' + @Actual_Amt + ')' 
EXECUTE sp_executesql @createQuery 
select @createQuery declare @insert nvarchar(max) = 'insert into ##temp(month, year,' 
declare @tempInsert nvarchar(MAX) 
set @i = 0 
while @i < @count 
begin 
    if(@i = 0) 
    begin 
select @tempInsert = @insert + 'budget_Amt,Actual_Amt) select month, year,budget_Amt,Actual_Amt from #testdata where id = ' +convert(varchar(10),@i+1) 
     select @tempInsert EXECUTE sp_executesql @tempInsert 
     set @i = @i + 1 
    end 
    else 
    begin 
    set @i = @i + 1 

select @tempInsert = @insert + 'budget_Amt' + convert(varchar(10),@i-1) + ',Actual_Amt' + convert(varchar(10),@i-1) + ') select month, year,budget_Amt,Actual_Amt from #testdata where id = ' +convert(varchar(10),@i) 
    select @tempInsert EXECUTE sp_executesql @tempInsert 
    end 
end 
select * from ##temp 
drop table #testdata, ##temp 
+0

ありがとうございます非常に1111 –

0

これを試してください:

select top 1 a.id, a.month,a.year,a.budget_Amt,a.Actual_Amt, null 
budget_Amt1,null Actual_Amt1,null budget_Amt2,null Actual_Amt2 from 
SampleTable a, SampleTable b, SampleTable c 
union 
select top 1 b.id, b.month,b.year,null budget_Amt,null Actual_Amt, 
b.budget_Amt,b.Actual_Amt,null budget_Amt2,null Actual_Amt2 from 
SampleTable a, SampleTable b, SampleTable c 
where b.id>a.id 
union 
select top 1 c.id, c.month,c.year,null budget_Amt,null Actual_Amt, 
null,null,c.budget_Amt,c.Actual_Amt from SampleTable a, SampleTable b, 
SampleTable c 
where c.id>b.id+a.id 
order by id 

私は、これは

+0

ありがとうございました!111 –