2014-04-10 44 views
0

我有2列的表格:SQL服务器:行到列与案例

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 

我试图显示此表以这种方式:

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

有这样的说法:

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 

但我得到这样的结果:

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 

由于我的Sql Server实现,我无法使用PIVOT功能。 每个ID中最多有4个客户端。 任何想法? SQL Fiddle

+1

你是什么意思的,因为你的SQL,你不能用做支点服务器实现? – pquest

+0

我不确定,但是我的MS SQL Server 2008有一个sql server 2000的实现 – andmike

回答

2

我会稍微改变语法使用聚合函数和子查询类似于:

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; 

SQL Fiddle with Demo

+0

谢谢。它看起来太棒了! – andmike