【问题标题】:MS SQL Server - concatenating in a particular wayMS SQL Server - 以特定方式连接
【发布时间】:2017-01-24 07:33:23
【问题描述】:

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

基本上,我有类似...

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 相同(因为这就是它们的分组依据)。

【问题讨论】:

    标签: sql sql-server substring


    【解决方案1】:

    请试试这个,我使用 Date 列作为 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
    

    【讨论】:

      猜你喜欢
      • 2018-08-30
      • 2015-05-06
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 2022-01-22
      • 2017-01-29
      • 2014-03-13
      • 1970-01-01
      相关资源
      最近更新 更多