Hi @Debilon
For STRING_AGG function, you can use Stuff instead.
And for ‘No Group By in an update’ issue,you may try put the 'Group By' query inside a subquery or another CTE.
Check this :
CREATE Table #PhoneTable
(ID INT IDENTITY PRIMARY KEY, Email VARCHAR(30),FirstName VARCHAR(30),LastName Varchar(30),
Address varchar(50), City Varchar(30), State Varchar(10), Zip Varchar(10), PhoneNumber VARCHAR(30));
INSERT INTO #PhoneTable (Email, FirstName, LastName,Address,City,State,Zip,PhoneNumber) VALUES
(Null,' Darla', 'Shmooz', '81 Grass Valley DR', 'New York', 'NY', '10021', '829-514-7725'),
('******@gmail.com',' Darla', 'Shmooz', '81 Grass Valley DR', 'New York', 'NY', '10021', '829-514-7725'),
(Null,' Darla', 'Shmooz', '81 Grass Valley DR', 'New York', 'NY', '10021', '829-914-8825'),
('******@gmail.com',' Darla', 'Shmooz', '81 Grass Valley DR', 'New York', 'NY', '10021', '829-914-9925'),
(Null,' Darla', 'Shmooz', '81 Grass Valley DR', 'New York', 'NY', '10021', '829-614-6625')
SELECT * FROM #PhoneTable
;WITH CTE AS
(
SELECT *,DENSE_RANK()OVER(PARTITION BY FirstName, LastName,Address,City,State,Zip ORDER BY ISNULL(email,'')DESC) AS RNum_Email
,DENSE_RANK()OVER(PARTITION BY FirstName, LastName,Address,City,State,Zip ORDER BY ISNULL(PhoneNumber,'')DESC) AS RNum_PhoneNumber
FROM #PhoneTable
),CTE2 AS
(
SELECT FirstName,LastName,Address,City,State,Zip
,MAX(CASE WHEN RNum_Email=1 THEN Email END) AS Email_1
,MAX(CASE WHEN RNum_Email=2 THEN Email END) AS Email_2
,STUFF((SELECT DISTINCT',' + Email FROM CTE WHERE RNum_Email > 2 FOR XML PATH('')),1,1,'') AS Email_3
,MAX(CASE WHEN RNum_PhoneNumber=1 THEN PhoneNumber END) AS PhoneNumber_1
,MAX(CASE WHEN RNum_PhoneNumber=2 THEN PhoneNumber END) AS PhoneNumber_2
,STUFF((SELECT DISTINCT',' + PhoneNumber FROM CTE WHERE RNum_PhoneNumber > 2 FOR XML PATH('')),1,1,'') AS PhoneNumber_3
FROM CTE
GROUP BY FirstName,LastName,Address,City,State,Zip
)
SELECT * FROM CTE2 --Check IF Correct Before Update
--UPDATE CTE2 SET Column...=Column...
Best regards,
LiHong