Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Cara optimal untuk menggabungkan/menggabungkan string

SOLUSI

Definisi optimal dapat bervariasi, tetapi inilah cara menggabungkan string dari baris yang berbeda menggunakan Transact SQL biasa, yang seharusnya berfungsi dengan baik di Azure.

;WITH Partitioned AS
(
    SELECT 
        ID,
        Name,
        ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber,
        COUNT(*) OVER (PARTITION BY ID) AS NameCount
    FROM dbo.SourceTable
),
Concatenated AS
(
    SELECT 
        ID, 
        CAST(Name AS nvarchar) AS FullName, 
        Name, 
        NameNumber, 
        NameCount 
    FROM Partitioned 
    WHERE NameNumber = 1

    UNION ALL

    SELECT 
        P.ID, 
        CAST(C.FullName + ', ' + P.Name AS nvarchar), 
        P.Name, 
        P.NameNumber, 
        P.NameCount
    FROM Partitioned AS P
        INNER JOIN Concatenated AS C 
                ON P.ID = C.ID 
                AND P.NameNumber = C.NameNumber + 1
)
SELECT 
    ID,
    FullName
FROM Concatenated
WHERE NameNumber = NameCount

Penjelasan

Pendekatan ini bermuara pada tiga langkah:

  1. Beri nomor pada baris menggunakan OVER dan PARTITION mengelompokkan dan mengurutkannya sesuai kebutuhan untuk rangkaian. Hasilnya adalah Partitioned CTE. Kami menghitung jumlah baris di setiap partisi untuk menyaring hasilnya nanti.

  2. Menggunakan CTE rekursif (Concatenated ) ulangi melalui nomor baris (NameNumber kolom) menambahkan Name nilai ke FullName kolom.

  3. Saring semua hasil kecuali yang dengan NameNumber tertinggi .

Harap diingat bahwa untuk membuat kueri ini dapat diprediksi, seseorang harus mendefinisikan kedua pengelompokan (misalnya, dalam baris skenario Anda dengan ID yang sama digabungkan) dan menyortir (saya berasumsi bahwa Anda cukup mengurutkan string menurut abjad sebelum penggabungan).

Saya telah dengan cepat menguji solusi pada SQL Server 2012 dengan data berikut:

INSERT dbo.SourceTable (ID, Name)
VALUES 
(1, 'Matt'),
(1, 'Rocks'),
(2, 'Stylus'),
(3, 'Foo'),
(3, 'Bar'),
(3, 'Baz')

Hasil kueri:

ID          FullName
----------- ------------------------------
2           Stylus
3           Bar, Baz, Foo
1           Matt, Rocks


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa itu DATALENGTH() di SQL Server?

  2. Cara Menginstal SQL Server di Mac

  3. Bagaimana Memulai dengan SQL Server di Azure

  4. Bandingkan DATETIME dan DATE dengan mengabaikan porsi waktu

  5. Memilih Alat Pemantauan SQL Server yang Sesuai dengan Kebutuhan Anda