Get unique values using STRING_AGG in SQL Server Get unique values using STRING_AGG in SQL Server sql-server sql-server

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.