Fusionner plusieurs lignes en une seule ligne à l'aide de SQL Server?

Je souhaite merge mes données de notification à l'aide d'une procédure stockée dans SQL Server. J'ai écrit la requête, mais dans cette requête j'obtiens plus que des données d'user dans plusieurs rangées.

Je veux merge les notifications suiveuses. comme "Utilisateur un user suivi b puis user b" get une notification comme "user a commencé à vous suivre". Encore une fois "l'user c suit l'user b" puis "l'user b a de nouveau reçu une notification comme" "l'user c vous suit".

Encore une fois "user d suivre à nouveau l'user b puis l'user b même comme get la notification". Mais maintenant je veux merge comme cette notification "Utilisateur a, b et 1 autre user a commencé à vous suivre".

Voici ma procédure stockée:

SELECT N.NotificationId, N.UserId, N.ActionUserId, (CASE WHEN N.NotificationTypeId = 1 THEN 1 WHEN N.NotificationTypeId = 7 THEN 3 ELSE 2 END) AS TypeId, AU.ProfileImage, AU.UserName, N.IsRead, (CASE WHEN N.NotificationTypeId = 1 THEN 1 WHEN N.NotificationTypeId = 7 THEN 3 ELSE 2 END) AS TypeId, N.NotificationTypeId, N.InsertDateTime FROM Notifications N INNER JOIN Users U ON N.UserId = U.UserId INNER JOIN Users AU ON N.ActionUserId = AU.UserId ORDER BY N.InsertDateTime DESC 

Ceci est mon actuel o / p =>

  NotificationId | UserId | ActionUserId | UserName | NotificationTypeId | InsertDateTime | ProfileImage 6 20 15 hbc 1 2017-06-22 17:14:16.803 20170416032403869.jpeg 5 20 16 tyu 1 2017-06-22 17:12:12.297 20170416031522534.jpeg 4 20 17 opl 1 2017-06-22 17:11:58.060 20170416031250102.jpeg 3 10 11 abc 1 2017-06-22 16:14:16.803 20170416032403867.jpeg 2 10 12 xyz 1 2017-06-22 16:14:12.297 20170416031522533.jpeg 1 10 13 rty 1 2017-06-22 16:13:58.060 20170416031250101.jpeg 

Ceci est mon excepté o / p =>

  NotificationId | UserId | ActionUserId | UserName | NotificationTypeId | InsertDateTime | ProfileImage | NotificationText 6 20 15 hbc 1 2017-06-22 17:14:16.803 20170416032403869.jpeg hbc,tyu and 1 other users followed you 3 10 11 abc 1 2017-06-22 16:14:16.803 20170416032403867.jpeg abc,xyz and 1 other users followed you 

Créer des données de test =>

 declare @Notifications table(NotificationID int, UserID int, ActionUserID int, NotificationTypeID int, InsertDateTime datetime); declare @Users table(UserID int, UserName nvarchar(10), ProfileImage nvarchar(50)) insert into @Notifications values (6,20,15,1,'2017-06-22 17:14:16.803'),(5,20,16,1,'2017-06-22 17:12:12.297'),(4,20,17,1,'2017-06-22 17:11:58.060'),(3,10,11,1,'2017-06-22 16:14:16.803'),(2,10,12,1,'2017-06-22 16:14:12.297'),(1,10,13,1,'2017-06-22 16:13:58.060'); insert into @Users values (15,'hbc','20170416032403869.jpeg'),(16,'tyu','20170416031522534.jpeg'),(17,'opl','20170416031250102.jpeg'),(10,'aaa',''),(11,'abc','20170416032403867.jpeg'),(12,'xyz','20170416031522533.jpeg'),(13,'rty','20170416031250101.jpeg'); 

Essaye ça:

 declare @Notifications table (NotificationID int, UserID int, ActionUserID int, NotificationTypeID int, InsertDateTime datetime); declare @Users table (UserID int, UserName nvarchar(10), ProfileImage nvarchar(50)) insert into @Notifications values (6,20,15,1,'2017-06-22 17:14:16.803'), (5,20,16,1,'2017-06-22 17:12:12.297'), (4,20,17,1,'2017-06-22 17:11:58.060'), (3,10,11,1,'2017-06-22 16:14:16.803'), (2,10,12,1,'2017-06-22 16:14:12.297'), (1,10,13,1,'2017-06-22 16:13:58.060'); insert into @Users values (15,'hbc','20170416032403869.jpeg'), (16,'tyu','20170416031522534.jpeg'), (17,'opl','20170416031250102.jpeg'), (10,'aaa',''), (20,'bbb',''), (11,'abc','20170416032403867.jpeg'), (12,'xyz','20170416031522533.jpeg'), (13,'rty','20170416031250101.jpeg'); declare @followCount table ( userid int, cnt int ) INSERT INTO @followCount select N.UserID, count(*) FROM @Notifications N INNER JOIN @Users U ON N.UserId = U.UserId INNER JOIN @Users AU ON N.ActionUserId = AU.UserId GROUP BY n.UserID declare @msg table ( userid int, NotificationMsg varchar(15) ) INSERT INTO @msg SELECT DISTINCT N.UserID, Stuff((SELECT ', ' + UserName FROM (SELECT UserID, UserName FROM (SELECT N.UserId, AU.UserName, ROW_NUMBER() OVER (PARTITION BY N.UserID ORDER BY N.InsertDateTime DESC) as rn FROM @Notifications N INNER JOIN @Users U ON N.UserId = U.UserId INNER JOIN @Users AU ON N.ActionUserId = AU.UserId INNER JOIN @followCount C on C.userid = N.UserID) t2 WHERE rn < 3) t2 WHERE t2.UserID = N.UserID FOR XML PATH('')), 1, 2, '') AS NotificationMsg FROM @Notifications N ; with cte as (SELECT N.NotificationId, N.UserId, N.ActionUserId, (CASE WHEN N.NotificationTypeId = 1 THEN 1 WHEN N.NotificationTypeId = 7 THEN 3 ELSE 2 END) AS TypeId, AU.ProfileImage, AU.UserName, N.NotificationTypeId, N.InsertDateTime, m.NotificationMsg + CASE WHEN c.cnt > 2 THEN ' + ' + FORMAT(c.cnt - 2, '0') + ' other users' END + ' followed you.' AS NotificationText, ROW_NUMBER() OVER (PARTITION BY N.UserID ORDER BY N.InsertDateTime DESC) as rn FROM @Notifications N INNER JOIN @Users U ON N.UserId = U.UserId INNER JOIN @Users AU ON N.ActionUserId = AU.UserId INNER JOIN @followCount C on C.userid = N.UserID INNER JOIN @msg M ON m.userid = N.UserID) SELECT NotificationID, UserID, ActionUserID, UserName, NotificationTypeID, InsertDateTime, ProfileImage, NotificationText FROM cte WHERE rn = 1 

S'il vous plaît noter que je devais append une input pour userid 20. Les données d'échantillon que vous avez donné seulement produit un logging.

Ce qui rendait particulièrement difficile, était l'exigence de deux noms plus x autres. Cela impliquait plusieurs étapes intermédiaires. Il se pourrait bien que quelqu'un de plus expert en SQL que moi puisse raccourcir cela. Veuillez également noter que j'ai seulement testé avec ces données. Vous devez vérifier avec des nombres supérieurs et inférieurs à 3 autres users pour vous assurer que tout est encore bon.