2016-09-16 88 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