Объединить вывод столбца по значениям через запятую - PullRequest
0 голосов
/ 25 октября 2019

Из приведенного ниже результата я хотел бы объединить committees_attendees на основе Work_WorkID, используя двоеточие:

select distinct 
    w.Work_WorkID, k.Name as "Committees_Attendees"  
from 
    DTree d, WMap m, WSubWork s, WWork w, WFAttrData a, KUAF k
where 
    d.DataID = m.Map_MapObjID 
    and m.Map_MapID = s.SubWork_MapID 
    and s.SubWork_WorkID = w.Work_WorkID
    and w.Work_WorkID = a.WF_ID 
    and d.DataID = 35269818 
    and a.WF_AttrID = 5 
    and k.ID = a.WF_ValInt

Это результат вышеприведенного запроса:

Work_WorkID Committees_Attendees
--------------------------------
35273587    Deva
35273587    Eswar

И это ожидаемый результат:

 Work_WorkID    Committees_Attendees
-------------------------------------
    35273587    Deva ; Eswar

Я пытался использовать путь XML, как показано ниже, но не смог получить желаемый вывод в два столбца.

SELECT DISTINCT  
    e.results AS "Secretariat_Attendees" 
FROM
    (SELECT
         REPLACE(STUFF(CAST((SELECT ' ; ' + CAST(c.Secretariat_Attendees AS VARCHAR(MAX)), c.WorkID
                             FROM 
                                 (SELECT DISTINCT 
                                      w.Work_WorkID AS WorkID,
                                      k.Name AS Secretariat_Attendees  
                                  FROM 
                                      DTree d, WMap m, WSubWork s, WWork w, WFAttrData a, KUAF k
                                  WHERE 
                                      d.DataID = m.Map_MapObjID 
                                      AND m.Map_MapID = s.SubWork_MapID 
                                      AND s.SubWork_WorkID = w.Work_WorkID
                                      AND w.Work_WorkID = a.WF_ID 
                                      AND d.DataID = 35269818 
                                      AND a.WF_AttrID = 17  
                                      AND k.ID = a.WF_ValInt) c 
                             ORDER BY
                                 c.WorkID
                             FOR XML PATH(''), TYPE) AS VARCHAR(MAX)), 1, 2, ''), ' ', '') AS results
     FROM
         wfattrdata t) e;

Результат:

Secretariat_Attendees
----------------------------------------------------------------------
AdminCEOOffice<WorkID>35273587</WorkID>;Diana<WorkID>35273587</WorkID>

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Вот как concat ваш столбец.

select * into #res from (
    select '35273587' as Work_WorkID ,'Deva' Committees_Attendees
    union all
    select '35273587' ,'Eswar' 
)res


select distinct t2.Work_WorkID,
    stuff((select N' ; ' + Committees_Attendees
       from (select Work_WorkID, Committees_Attendees
          from #res t1 where t1.Work_WorkID = t2.Work_WorkID) AS t  
       for xml path('')
    ), 1, 2, '') + N''
from #res t2;
drop table #res

применение к вашим фактическим таблицам, его легче использовать cte

with cte as (
select  Distinct w.Work_WorkID,k.Name as  "Committees_Attendees"  from DTree d,WMap m,WSubWork s,WWork w,WFAttrData a,KUAF k
    where d.DataID=m.Map_MapObjID and m.Map_MapID=s.SubWork_MapID and s.SubWork_WorkID=w.Work_WorkID
    and w.Work_WorkID=a.WF_ID and d.DataID=35269818 and a.WF_AttrID=5 and k.ID=a.WF_ValInt
)
select distinct t2.Work_WorkID,
    stuff((select N' ; ' + Committees_Attendees
       from (select Work_WorkID, Committees_Attendees
          from cte t1 where t1.Work_WorkID = t2.Work_WorkID) AS t  
       for xml path('')
    ), 1, 2, '') + N''
from cte t2;
0 голосов
/ 25 октября 2019

Если вы говорите об Oracle SQL, вы можете использовать LISTAGG (List Aggregate). Это агрегатная функция, которая делает именно это (преобразует столбцы в символьно-разделенную строку).

Однако она имеет ожидаемое ограничение максимально допустимых значений;так что вы не сможете объединить тысячу столбцов XD.

Составить список по вашему запросу:

SELECT "Work_WorkID", LISTAGG("Committees_Attendees", ' ; ') WITHIN GROUP (ORDER BY "Committees_Attendees") "Committees_Attendees" 
    FROM
    (SELECT DISTINCT W.WORK_WORKID "Work_WorkID", K.NAME AS "Committees_Attendees" 
        FROM DTREE D, WMAP M, WSUBWORK S, WWORK W, WFATTRDATA A, KUAF K
            WHERE D.DATAID = M.MAP_MAPOBJID AND M.MAP_MAPID = S.SUBWORK_MAPID AND S.SUBWORK_WORKID = W.WORK_WORKID
            AND W.WORK_WORKID = A.WF_ID AND D.DATAID = 35269818 AND A.WF_ATTRID = 5 AND K.ID = A.WF_VALINT)
        -- GROUP BY "Work_WorkID"

Если вам это нужно для MySQL, вам может потребоваться поиск GROUP_CONCAT.

Надеюсь, это поможет !!!

...