2014-03-25 66 views
1

我有这样的一个表:基于现有列数据创建列,重复数据存在

Acct MasterAcct 
------- ------------- 
123  M01 
123  M02 
234  M03 
345  M04 
456  M05 
456  M06 
456  M07 

我想打破MasterAcct列到三列(Master1,Master2,为主设备)。一个帐户最多可以有三个与之关联的主帐户。上一个表的示例输出将在一行上具有账号#456,然后在Master1,Master2和Master3中具有三个主账号。谁能帮忙?


+0

的可能重复[SQL Server的PIVOT例子吗?(http://stackoverflow.com/questions/24470/sql-server-pivot-examples) –

+1

的SQL Server版本你用吗? –

+0

我使用sql server 2005 – user3456446

回答

1

您可以结合使用PIVOTROW_NUMBER()排名功能。

SELECT Acct, [1] as [Master1], [2] as [Master2], [3] as [Master3] 
FROM 
    (
     SELECT Acct, 
      MasterAcct, 
      ROW_NUMBER() OVER(PARTITION BY acct ORDER BY MasterAcct) as mid 
     FROM tbl 
    ) as t 
PIVOT 
(
    MIN(MasterAcct) 
    FOR mid IN ([1], [2], [3]) 
) as p 

SQL FIDDLE DEMO

可以实现在不使用PIVOT相同的结果。以下查询很容易理解。

SELECT 
    Acct, 
    MAX(CASE WHEN mid=1 THEN MasterAcct END) as [Master1], 
    MAX(CASE WHEN mid=2 THEN MasterAcct END) as [Master2], 
    MAX(CASE WHEN mid=3 THEN MasterAcct END) as [Master3] 
FROM 
    (
     SELECT Acct, 
      MasterAcct, 
      ROW_NUMBER() OVER(PARTITION BY acct ORDER BY MasterAcct) as mid 
     FROM tbl 
    ) t 
GROUP BY Acct 

SQL FIDDLE DEMO

+0

感谢哈姆雷特。我们可以做到这一点没有分区和行号?另外,你能解释一下这里的逻辑吗?我问,因为我只知道如何做简单的支点。 –

+1

非常感谢。这工作完美。我对SQL很陌生,所以我也想理解它背后的逻辑。再次感谢 – user3456446