Pregunta

I have a table with 2 columns:

CREATE TABLE Prop_Cl 
(
 Id int, 
 ClId int
);
INSERT INTO Prop_Cl
(Id, ClId)
VALUES
(1, 1111111),
(1, 1111112),
(1, 1111113),
(2, 2222221),
(3, 3333331),
(3, 3333332);



ID     CLID  
1      1111111  
1      1111112  
1      1111113  
2      2222221  
3      3333331  
3      3333332  

I'm trying to show this table in that way:

ID  CLIENT 1  CLIENT 2  CLIENT 3  CLIENT 4  
1   1111111   1111112   1111113   0  
2   2222221   0         0         0  
3   3333331   3333332   0         0 

with this statement:

SELECT p.Id, 
CASE WHEN (ROW_NUMBER() OVER(PARTITION BY p.Id ORDER BY p.Id)) = 1 THEN p.ClId ELSE 0 END  AS 'Client 1',
CASE WHEN (ROW_NUMBER() OVER(PARTITION BY p.Id ORDER BY p.Id)) = 2 THEN p.ClId ELSE 0 END  AS 'Client 2',
CASE WHEN (ROW_NUMBER() OVER(PARTITION BY p.Id ORDER BY p.Id)) = 3 THEN p.ClId ELSE 0 END  AS 'Client 3',
CASE WHEN (ROW_NUMBER() OVER(PARTITION BY p.Id ORDER BY p.Id)) = 4 THEN p.ClId ELSE 0 END  AS 'Client 4'
FROM Prop_Cl p

But I get this result:

ID  CLIENT 1    CLIENT 2    CLIENT 3    CLIENT 4
1   1111111     0           0           0
1   0           1111112     0           0
1   0           0           1111113     0
2   2222221     0           0           0
3   3333331     0           0           0
3   0           3333332     0           0

I can't use PIVOT function because of my Sql Server realisation. There are maximum 4 clients in each ID. Any ideas? SQL Fiddle

¿Fue útil?

Solución

I would change the syntax slightly to use an aggregate function and a subquery similar to:

select id,
  max(case when seq = 1 then ClId else 0 end) Client1,
  max(case when seq = 2 then ClId else 0 end) Client2,
  max(case when seq = 3 then ClId else 0 end) Client3,
  max(case when seq = 4 then ClId else 0 end) Client4
from
(
  select Id, ClId,
    ROW_NUMBER() OVER(PARTITION BY Id ORDER BY Id) seq
  from Prop_Cl
) s
group by id;

See SQL Fiddle with Demo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top