2012-01-04 48 views
3

我使用SQL Server 2008中我有数据如下表:如何将多行数据合并为一个?

Team Email    Groups 
------- ------------------ ------ 
|Team1|-|[email protected]|-|A| 
|Team1|-|[email protected]|-|B| 
|Team1|-|[email protected]|-|C| 
|Team2|-|[email protected]|-|A| 
|Team2|-|[email protected]|-|B| 
|Team2|-|[email protected]|-|C| 

我想在这种格式的数据:

Team A     B     C 
------- ------------------ ------------------ ------------------ 
|Team1|-|[email protected]|-|[email protected]|-|[email protected]| 
|Team2|-|[email protected]|-|[email protected]|-|[email protected]| 

我怎样才能做到这一点?

+1

什么你想要做的是短线,http://msdn.microsoft.com/en-us/library/ms177410.aspx语法有时是棘手的工作出。 – 2012-01-04 15:27:57

+2

总是3组?每组的行数始终相同? – gbn 2012-01-04 15:32:09

+0

@gbn,是的......总是三个组 – daveomcd 2012-01-04 15:54:32

回答

7

使用PIVOT你可以做以下

With SampleData AS 
(
SELECT 'Team1' as Team , '[email protected]' as email, 'A' as Groups 
UNION SELECT 'Team1' as Team , '[email protected]' as email, 'B' as Groups 
UNION SELECT 'Team1' as Team , '[email protected]' as email, 'C' as Groups 
UNION SELECT 'Team2' as Team , '[email protected]' as email, 'A' as Groups 
UNION SELECT 'Team2' as Team , '[email protected]' as email, 'B' as Groups 
UNION SELECT 'Team2' as Team , '[email protected]' as email, 'C' as Groups 
) 
SELECT Team, A, B,C FROM 
(SELECT * FROM SampleData) source 
PIVOT 
(MAX(email) FOR Groups IN ([A], [B], [C]))as pvt 

主要生产

Team A    B    C 
----- ---------------- ---------------- ---------------- 
Team1 [email protected] [email protected] [email protected] 
Team2 [email protected] [email protected] [email protected] 

见工作Data.SE example

在DB不支持旋转,则可以改为做多的加入到你的桌子。尽管您可能想要,但正如GBN指出的那样,因为我们没有使用聚合。

With SampleData AS 
(
SELECT 'Team1' as Team , '[email protected]' as email, 'A' as Groups 
UNION SELECT 'Team1' as Team , '[email protected]' as email, 'B' as Groups 
UNION SELECT 'Team1' as Team , '[email protected]' as email, 'C' as Groups 
UNION SELECT 'Team2' as Team , '[email protected]' as email, 'A' as Groups 
UNION SELECT 'Team2' as Team , '[email protected]' as email, 'B' as Groups 
UNION SELECT 'Team2' as Team , '[email protected]' as email, 'C' as Groups 
) 

SELECT 
    source.Team, 
    A.email, 
    B.email, 
    C.email 
FROM 
    (SELECT DISTINCT TEAM From SampleData) source 
    LEFT JOIN SampleData A 
    ON source.Team = A.Team 
    AND A.GROUPS = 'A' 
    LEFT JOIN SampleData B 
    ON source.Team = B.Team 
    AND B.GROUPS = 'B' 
    LEFT JOIN SampleData C 
    ON source.Team = C.Team 
    AND C.GROUPS = 'C' 

见工作Data.SE example

+1

个人而言,如果不需要聚合,我可能会自动加入 – gbn 2012-01-04 15:44:27

+1

@gbn我明白你的观点并更新了我的答案,但我并不都对'SELECT DISTINCT TEAM From SampleData“,但这可能只是样本数据。 – 2012-01-04 15:53:10

+0

这个作品除了我仍然得到行的空值,例如这里是我的结果中的示例行。 'Team1 NULL NULL email1 @ email.com' 'Team1 [email protected] NULL NULL' 'Team1 NULL [email protected] NULL' 我希望能得到这个... 'Team1 [email protected] [email protected] email3 @ email.com' – daveomcd 2012-01-04 15:53:52