Get unique values using STRING_AGG in SQL Server
Use the DISTINCT
keyword in a subquery to remove duplicates before combining the results: SQL Fiddle
SELECT ProjectID,STRING_AGG(value, ',') WITHIN GROUP (ORDER BY value) AS NewFieldfrom ( select distinct ProjectId, newId.value FROM [dbo].[Data] WITH(NOLOCK) CROSS APPLY STRING_SPLIT([bID],';') AS newID WHERE newID.value IN ( 'O95833' , 'Q96NY7-2' ) ) xGROUP BY ProjectIDORDER BY ProjectID
You can use distinct
in the subquery used for the apply
:
SELECT d.ProjectID, STRING_AGG( newID.value, ',') WITHIN GROUP (ORDER BY newID.value) AS NewFieldFROM [dbo].[Data] d CROSS APPLY (select distinct value from STRING_SPLIT(d.[bID], ';') AS newID ) newIDWHERE newID.value IN ( 'O95833' , 'Q96NY7-2' ) group by projectid;
As @SeanLange pointed out in the comments, this is a terrible way to pull out the data, but if you had to, just make it 2 separate queries as follows:
SELECT ProjectID ,STRING_AGG( val, ',') WITHIN GROUP (ORDER BY val) AS NewFieldFROM( SELECT DISTINCT ProjectID ,newID.value AS val FROM [dbo].[Data] WITH(NOLOCK) CROSS APPLY STRING_SPLIT([bID],';') AS newID WHERE newID.value IN ('O95833' , 'Q96NY7-2') ) tGROUP BY ProjectID
That should do it.