2014-09-03 32 views
0

讓說我的表像同名值SQL CONCAT行

Name | Stage | Date 
------------------- 
A | 1st | 03092014  
A | 2nd | 04092014  
A | 3rd | 05092014  
B | 1st | 06092014  
B | 2nd | 08092014  
C | 1st | 03092014 

我不知道如何編寫SQL代碼至極將Concat的有相同的名字行,我會得到類似的東西

Name | Stage   | Date 
----------------------+----------------------------- 
A | 1st , 2nd, 3rd | 03092014 04092014 05092014  
B | 1st, 2nd  | 06092014 08092014  
C | 1st   | 03092014 

我是否需要使用for循環遍歷表,還是有更好的方法來做到這一點?

UPD: 我發現我需要在Excel中

使用該查詢
+1

哪個數據庫使用的是 - SQL有多個數據庫如果SQL Server 2008及以上的話可以參考FIDDLE這裏 - HTTP://www.sqlfiddle .com /#!3/e2803/7 – Murtaza 2014-09-03 06:40:18

+0

不確定您希望使用哪種數據庫服務器。 – 2014-09-03 07:15:57

+0

@MatsKindahl好吧,這是MS SQL – DanilGholtsman 2014-09-03 07:16:42

回答

3

您可以使用此GROUP_CONCAT

SELECT Name 
    , GROUP_CONCAT(Stage) AS Stages 
    , GROUP_CONCAT(Date) AS Dates 
    FROM my_table 
GROUP BY Name; 
1

對於你的問題 - 我假設你正在使用MS SQL Server 2008或更高,以獲得他想要的輸出

我會建議使用CROSS APPLY這裏Concat的數據 -

假設你的表名 - temptable

SELECT distinct tblMain.Name, substring(stages, 1, len(stages)-1) as [Stage],substring(dates, 1, len(dates)-1) as [Date] 
FROM temptable tblMain 
CROSS APPLY (
    SELECT LTRIM(RTRIM(Stage)) + ',' 
    FROM temptable tblDup1 WITH(NOLOCK) 
    WHERE tblDup1.Name= tblMain.Name 

    FOR XML PATH('') 
) t1 (stages) 
CROSS APPLY (
    SELECT LTRIM(RTRIM(Date)) + ' ' 
    FROM temptable tblDup2 WITH(NOLOCK) 
    WHERE tblDup2.Name= tblMain.Name 

    FOR XML PATH('') 
) t2 (dates) 

工作FIDDLE OUTPUT

+0

有趣的比較你如何在SQL Server和MySQL中完成它(希望有人也會添加一個Oracle 11g代碼片段)。 :) – 2014-09-03 07:17:27

+0

哈哈哈哈哈!!! – Murtaza 2014-09-03 07:17:54