My table is like this: Sitecode Month Amount -------- ----- ------ XX Jan 1000 XX Jan 3000 XX Apr 3000 XX Apr 1000 What I want is, to show the result something like this: Sitecode MonthJAN MonthAPR -------- -------- -------- XX 4000 4000
As others have said this is known as a [`PIVOT`][1]. There are several ways in which you can transform your data from rows into columns of data. If you know the values ahead of time, then you can hard-code the values. Prior to the `PIVOT` function you would use an aggregate function with a `CASE` statement. **Aggregate/CASE Version:** select sitecode, sum(case when [month] = 'Jan' then amount else 0 end) MonthJan, sum(case when [month] = 'Apr' then amount else 0 end) MonthApr from yourtable group by sitecode; See [SQL Fiddle with Demo][2]. The `PIVOT` function was made available in SQL Server 2005, so if you are using that version or a newer one then you can apply that to your data. **Static PIVOT:** select * from ( select sitecode, [month], amount from yourtable ) src pivot ( sum(amount) for month in (Jan, Apr) ) piv; See [SQL Fiddle with Demo][3] The above two versions work great if you know the values ahead of time. If not, then you will use dynamic sql to create the result. **Dynamic PIVOT:** DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(month) from yourtable FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') set @query = 'SELECT sitecode,' + @cols + ' from ( select sitecode, [month], amount from yourtable ) x pivot ( sum(amount) for month in (' + @cols + ') ) p ' execute(@query) See [SQL Fiddle with Demo][4] All 3 versions of this will return the same result: | SITECODE | JAN | APR | -------------------------- | XX | 4000 | 4000 | [1]: http://msdn.microsoft.com/en-us/library/ms177410%28v=sql.105%29.aspx [2]: http://sqlfiddle.com/#!3/73b2f/4 [3]: http://sqlfiddle.com/#!3/07d60/2 [4]: http://sqlfiddle.com/#!3/07d60/1