2016-09-16 8 views
2

私は、部分文字列のようなものを使用して連結する必要のある特定のテーブルを持っていますが、特定の方法です。ヌルがたくさんありますが、まだ注意を払う必要があります。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 

はまた、我々は常に 日を持っています、注意してください。それはnullではありません。 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 
関連する問題