MSSQL Gruplanmış Verileri Tek Satırda Birleştirme

Merhabalar,

SQL içinde bazı verileri birleştirmemiz (concatenate) gerekebilir. MSSQL de bulunan bir işlem bunun için biçilmiş kaftandır.

Örn: Bir tabloda bir kullanıcıya ait birden fazla e-posta adresi bulunabilir. Bu e-postaları “UserID” bazında gruplayarak e-posta adreslerini bir karakter ile birleştirmek istenilebilir.

2 – kaan1@test.com; kaan2@test.com

 
Bu sorgu ile aynı kullanıcıya ait e-postaları “; “ karakteri ile birleştirebiliriz.

DECLARE @EMailAdress TABLE
(
	ID INT,
	UserID INT,
	EMail nvarchar(50)
)

INSERT INTO @EMailAdress VALUES
(1, 12, 'test_01@test.com'),
(2, 13, 'test_02@test.com'),
(3, 13, 'test_03@test.com'),
(4, 14, 'test_04@test.com'),
(5, 15, 'test_05@test.com'),
(6, 16, 'test_06@test.com')

SELECT
	EMA1.UserID,
    STUFF((SELECT '; ' + EMA2.EMail
            FROM @EMailAdress AS EMA2
            WHERE EMA1.UserID = EMA2.UserID
            FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, ''
		) AS EMail
FROM @EMailAdress AS EMA1
GROUP BY EMA1.UserID

 
Aynı yöntemin farklı bir şekilde kullanımı;

DECLARE @EMailAdress TABLE
(
	ID INT,
	UserID INT,
	EMail nvarchar(50)
)

INSERT INTO @EMailAdress
SELECT 1, 12, 'test_01@test.com'
UNION SELECT 2, 13, 'test_02@test.com'
UNION SELECT 3, 13, 'test_03@test.com'
UNION SELECT 4, 14, 'test_04@test.com'
UNION SELECT 5, 15, 'test_05@test.com'
UNION SELECT 6, 16, 'test_06@test.com';

WITH TT AS
(
  SELECT UserID FROM @EMailAdress
  GROUP BY UserID
)

SELECT
	TT.UserID,
	STUFF((SELECT '; ' + EMail
			FROM @EMailAdress WHERE UserID = TT.UserID
			FOR XML PATH('')), 1, 1, ''
		) AS EMail
FROM TT;

 

// Sonuçlar:
ParentID EMail
12	 test_01@test.com
13	 test_02@test.com; test_03@test.com
14	 test_04@test.com
15	 test_05@test.com
16	 test_06@test.com

Yorum bırakın