11

I am trying to pivot on multiple columns. I am using SQL server 2008. Here is what I have tried so far

CREATE TABLE #t ( id int, Rscd varchar(10),Accd varchar(10),position int)

INSERT INTO #t Values (10,'A','B',1)

INSERT INTO #t Values (10,'C','D',2)

Select id,[1],[2],[11],[12] FROM
(SELECT id, Rscd,Accd, position , position +10 as Aposition 
From #t)
As query
PIVOT (MAX(Rscd )
      FOR Position IN ([1],[2])) AS Pivot1
      PIVOT (MAX(Accd )
      FOR Aposition IN ([11],[12])) AS Pivot2

The below indicated is the result that I am getting

id  1     2     11    12
10  NULL  C     NULL  D
10  A     NULL  B     NULL

But the result that I am trying to achieve is ,

id  1   2   11   12
10  A   C   B    D

Any help ? what is wrong in my code.

1

3 Answers 3

15

I would unpivot the columns into pairs first, then pivot them. Basically the unpivot process will convert the pairs of columns (rscd, position and accd, aposition) into rows, then you can apply the pivot. The code will be:

select id, [1], [2], [11], [12]
from
(
  select id, col, value
  from #t
  cross apply
  (
    select rscd, position union all
    select Accd, position + 10
  ) c (value, col)
) d
pivot
(
  max(value)
  for col in ([1], [2], [11], [12])
) piv;

See SQL Fiddle with Demo

Sign up to request clarification or add additional context in comments.

14 Comments

Bluefeet - Can we aggregate by multiple columns in pivot ? Eg. max(value), min(col1), sum(col5). If yes, is there a good example for that ?
@Trojan.ZBOT There might be other ways to get the final result besides using pivot. If you have a specific question, then I would post one to get the best answer...it would be easier than going back and forth in the comments. :)
I am a bit concerned about downvoters. But, can we have pivot ( max(value), min(col1), sum(col5) for col in ([1], [2], [11], [12]) ) piv;
If you formulate a good question with table structure, sample data, desired result and even include samples of what you tried, then you shouldn't worry about downvotes. No, you can't pivot on multiple columns that way.
No, you can't pivot on multiple columns that way
|
5
Select id,sum([1]),sum([2]),sum([11]),sum([12]) FROM
(SELECT id, Rscd,Accd, position , position +10 as Aposition 
From #t)
As query
PIVOT (MAX(Rscd )
      FOR Position IN ([1],[2])) AS Pivot1
      PIVOT (MAX(Accd )
      FOR Aposition IN ([11],[12])) AS Pivot2

group by id

1 Comment

Could you elaborate a bit on how your solution achieves what OP asked? Just copy/pasting code without understanding what it does ain't fun.
-3

Dont Use the ID Column. Use a derived table to retrieve all columns except the ID and then use the PIVOT table.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.