Как избежать дубликатов в функции STRING_AGG

Мой запрос ниже:

select 
    u.Id,
    STRING_AGG(sf.Naziv, ', ') as 'Ustrojstvena jedinica',
    ISNULL(CONVERT(varchar(200), (STRING_AGG(TRIM(p.Naziv), ', ')), 121), '') 
    as 'Partner',

from Ugovor as u

        left join VezaUgovorPartner as vup
            on vup.UgovorId = u.Id AND vup.IsDeleted = 'false'
        left join [TEST_MaticniPodaci2].dbo.Partner as p
            on p.PartnerID = vup.PartnerId
        left join [dbo].[VezaUgovorUstrojstvenaJedinica] as vuu
            on vuu.UgovorId = u.Id
        left join [TEST_MaticniPodaci2].hcphs.SifZavod as sf
            on sf.Id = vuu.UstrojstvenaJedinicaId
        left join [dbo].[SifVrstaUgovora] as vu
            on u.VrstaUgovoraId = vu.Id

  group by u.Id, sf.Naziv

Моя проблема в том, что у меня может быть больше sf.Naziv, а также только один sf.Naziv, поэтому я должен проверить, есть ли он, а затем показать только один результат, а если есть два или более, показать больше результатов. Но пока проблема в том, что когда у меня есть только один sf.Naziv, запрос возвращает два sf.Naziv с одинаковым именем, потому что в первом STRING_AGG у меня больше записей о p.Naziv.

Я понятия не имею, как внедрить DISTINCT в функцию STRING_AGG.

Любые другие решения приветствуются, но я думаю, что они должны работать с функцией DISTINCT.


person Community    schedule 26.02.2018    source источник
comment
Сначала получите отдельные значения, затем во втором запросе выполните STRING_AGG или реализуйте пользовательский агрегат SQ CLR — они поддерживают разные.   -  person gotqn    schedule 26.02.2018
comment
вам может потребоваться выполнить подзапрос с дедупликацией nasif, а затем выполнить выбор из него, применяя string_agg   -  person Jayvee    schedule 26.02.2018
comment
не могли бы вы добавить любые примеры данных и результат, которые вы должны хотеть.   -  person Fmanin    schedule 13.03.2018
comment
Используйте одно из решений, показанных здесь.   -  person Brent Arias    schedule 02.08.2018


Ответы (2)


Похоже, что отдельные не будут работать, поэтому вам нужно поместить весь запрос в подзапрос, удалить там дубликаты, а затем выполнить STRING_AGG для данных, у которых нет дубликатов.

SELECT STRING_AGG(data)
FROM (
   SELECT DISTINCT FROM ...
)
person megabc123    schedule 05.10.2018

Мне нравится этот формат для различных значений: (d требуется, но вы можете использовать любое имя переменной)

SELECT STRING_AGG(LoadNumber, ',') as LoadNumbers FROM (SELECT DISTINCT LoadNumber FROM [ASN]) d
person JBoothUA    schedule 11.11.2020