2012-01-04 45 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