MS SQL Server-以特定方式连接

MS SQL Server-以特定方式连接,sql,sql-server,substring,Sql,Sql Server,Substring,我有一个特殊的表,我需要使用类似子字符串的东西来连接它,但是要以一种特殊的方式。将会有很多空值,但我们仍然需要关注它们 基本上,我有点像 PID Date Flag1 Flag2 Code 11 01/01/2014 1 0 16 11 25/12/2014 1

我有一个特殊的表,我需要使用类似子字符串的东西来连接它,但是要以一种特殊的方式。将会有很多空值,但我们仍然需要关注它们

基本上,我有点像

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
会导致(很长)

这样,在我稍后使用的一些代码中,我将能够知道每个标志属于哪个日期

有什么想法吗?到目前为止,我一直在使用常规的子字符串命令,这些命令可以将内容放入正确的字段中,但我无法判断哪些内容属于哪些内容

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相同(因为它们是按此分组的)。

请尝试此操作,我已将日期列用作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
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