sql >> Databáze >  >> RDS >> Sqlserver

Zřetězit více datových řádků do jednoho řádku

Ke generování hodnot csv můžete použít STUFF. Níže je to, co běžně používám.

    CREATE TABLE #Book
    (
        Id INT ,
        NAME VARCHAR(100) ,
        Description VARCHAR(100)
    );

CREATE TABLE #BookReader
    (
        BookId INT ,
        Name VARCHAR(100)
    );


CREATE TABLE #BookVersion
    (
        BookId INT ,
        Version VARCHAR(10)
    );


INSERT INTO #Book ( Id ,
                    NAME ,
                    Description )
VALUES ( 1 ,            -- Id - int
         'Book1' ,      -- NAME - varchar(100)
         'Book 1 Title' -- Description - varchar(100)
    ) ,
       ( 2 ,            -- Id - int
         'Book2' ,      -- NAME - varchar(100)
         'Book 2 Title' -- Description - varchar(100)
       ) ,
       ( 3 ,            -- Id - int
         'Book3' ,      -- NAME - varchar(100)
         'Book 3 Title' -- Description - varchar(100)
       ) ,
       ( 4 ,            -- Id - int
         'Book5' ,      -- NAME - varchar(100)
         'Book 5 Title' -- Description - varchar(100)
       );

INSERT INTO #BookReader ( BookId ,
                          Name )
VALUES ( 1 ,     -- BookId - int
         'James' -- Name - varchar(100)
    ) ,
       ( 2 ,        -- BookId - int
         'Stephane' -- Name - varchar(100)
       ) ,
       ( 2 ,       -- BookId - int
         'Michael' -- Name - varchar(100)
       );

INSERT INTO #BookVersion ( BookId ,
                           Version )
VALUES ( 1 ,  -- BookId - int
         'v1' -- Version - varchar(10)
    ) ,
       ( 1 ,  -- BookId - int
         'v2' -- Version - varchar(10)
       ) ,
       ( 2 ,  -- BookId - int
         'v1' -- Version - varchar(10)
       ) ,
       ( 2 ,  -- BookId - int
         'v2' -- Version - varchar(10)
       ) ,
       ( 2 ,  -- BookId - int
         'v3' -- Version - varchar(10)
       );


SELECT b.Id ,
       LTRIM(STUFF((   SELECT ', ' + br1.[Name] AS [text()]
                 FROM   #BookReader br1
                 WHERE  br1.BookId = b.Id
                 FOR XML PATH('')) ,
             1 ,
             1 ,
             '')) AS Reader ,
       LTRIM(STUFF((   SELECT ', ' + Version
                 FROM   #BookVersion bv1
                 WHERE  bv1.BookId = b.Id
                 FOR XML PATH('')) ,
             1 ,
             1 ,
             '')) AS version
FROM   #Book b;



DROP TABLE #Book;
DROP TABLE #BookReader;
DROP TABLE #BookVersion;

Výsledek:

+----+--------------------+-------------+
| Id |       Reader       |   Version   |
+----+--------------------+-------------+
|  1 | James              | v1, v2      |
|  2 | Stephane, Michael  | v1, v2, v3  |
|  3 | NULL               | NULL        |
|  4 | NULL               | NULL        |
+----+--------------------+-------------+



  1. Průměrná tabulka historie akcií

  2. Java String - Načítání znaků jiných jazyků z mysql - Jsou data kompletní?

  3. Nejmenší hodnota, ale ne NULL v Oracle SQL

  4. sql:DELETE + INSERT vs UPDATE + INSERT