2016-09-16 91 views
2

我有一個特殊的表,我需要使用像substring這樣的東西連接,但以特定的方式。將會有很多空值,但我們仍然需要關注它們。MS SQL Server - 以特定方式連接

基本上,我有類似...

PID   Date    Flag1   Flag2   Code 
11   01/01/2014   1    0    16 
11   25/12/2014   1    1    48 
11   16/07/2016   0    1    9 
12   07/01/2014       0    16 
12   08/01/2014   1        
12   09/01/2014           16 
13   01/10/2014   1        4 
13   01/11/2014   1    0    16 
13   01/12/2014       0    48 

會導致(超長)...

PID   Date         Flag1 Flag2 Code 
11   01/01/2014,25/12/2014,16/07/2014,  1,1,0, 0,1,1, 16,48,9, 
12   07/01/2014,08/01/2014,09/01/2014,  ,1,,  0,,,  16,,16, 
13   01/10/2014,01/11/2014,01/12/2014,  1,1,, ,0,0, 4,16,48, 

這樣一來,在一些代碼,我會在以後使用,我將能夠確定每個標誌屬於哪個日期。

任何想法?到目前爲止,我只是使用常規的子字符串命令將事物放入正確的字段中,但我不知道屬於哪個字段。

SELECT DISTINCT PS2.PID, substring 
         ((SELECT  ',' + CAST(CONVERT(VARCHAR(10), PS1.Date, 111) AS NVARCHAR) AS [text()] 
          FROM   dbo.PS PS1 
          WHERE  PS1.PID = PS2.PID 
          ORDER BY PS1.PID, PS1.Date FOR XML PATH('')), 2, 9999) + ',' [Date], substring 
         ((SELECT  ',' + LEFT(CAST(LUC.Code AS NVARCHAR), 2) AS [text()] 
          FROM   dbo.PS PS1 INNER JOIN 
                 dbo.MyCodes LUC ON PS1.Code = LUC.Id 
          WHERE  PS1.PID = PS2.PID 
          ORDER BY PS1.PID, PS1.Date FOR XML PATH('')), 2, 9999) + ',' [Code], substring 
         ((SELECT  ',' + LEFT(CAST(PS1.Flag1 AS NVARCHAR), 1) AS [text()] 
          FROM   dbo.PS PS1 
          WHERE  PS1.PID = PS2.PID 
          ORDER BY PS1.PID, PS1.Date FOR XML PATH('')), 2, 9999) + ',' [Flag1], substring 
         ((SELECT  ',' + LEFT(CAST(PS1.Flag2 AS NVARCHAR), 1) AS [text()] 
          FROM   dbo.PS PS1 
          WHERE  PS1.PID = PS2.PID 
          ORDER BY PS1.PID, PS1.Date FOR XML PATH('')), 2, 9999) + ',' [Flag2] 
FROM   dbo.PS PS2 

還應注意,我們將始終一個日期。那不會是空的。與PID一樣(就像他們分組的那樣)。

回答

0

請試試這個,我已經使用日期列EDATE所以請替換列名和表名原來的一個:

SELECT t1.PID, 
STUFF(
    (SELECT ',' + cast(EDate AS varchar) 
    FROM #tmpone t WHERE t.PID = t1.PID 
    FOR XML PATH('')) 
    , 1, 1, '') Edate, 
STUFF(
    (SELECT ',' + cast(Flag1 AS varchar) 
    FROM #tmpone t WHERE t.PID = t1.PID 
    FOR XML PATH('')) 
    , 1, 1, '') Flag1, 
STUFF(
    (SELECT ',' + cast(Flag2 AS varchar) 
    FROM #tmpone t WHERE t.PID = t1.PID 
    FOR XML PATH('')) 
    , 1, 1, '') Flag2, 
STUFF(
    (SELECT ',' + cast(Code AS varchar) 
    FROM #tmpone t WHERE t.PID = t1.PID 
    FOR XML PATH('')) 
    , 1, 1, '') Code  
FROM #tmpone t1 
GROUP BY t1.PID