Объединить значения из одного столбца для одного и того же первичного ключа?

#sql #sql-server #concat

#sql #sql-сервер #конкатенация

Вопрос:

У меня есть запрос, который находит все лекарства, введенные в аптечную систему выдачи в определенный день. Он находит все времена администрирования и создает отдельную строку для каждого.

 PATIENT1 DRUG1  9:00AM
PATIENT1 DRUG1  1:00PM
PATIENT1 DRUG1  5:00PM
PATIENT1 DRUG1  9:00PM
  

Мне нужно, чтобы объединить все время администрирования в одной ячейке, разделенной запятой.

 PATIENT1 DRUG1  9:00AM, 1:00PM, 5:00PM, 9:00PM
  

Ответ №1:

Использовать string_agg() :

 select patient, drug,
       string_agg(time, ',') within group (order by time)
from t
group by patient, drug;
  

В более старых версиях SQL Server метод использует for xml :

 select pd.*,
       stuff( (select concat(',', time)
               from t
               where t.patient = pd.patient and t.drug = pd.drug
               order by time
               for xml path ('')
              ), 1, 1, ''
            ) as times
from (select distinct patient, drug) pd;
  

Комментарии:

1. Спасибо за ответ. В настоящее время я использую Server 2016, и функция STRING_AGG недоступна.

Ответ №2:

например, в этой таблице у вас есть результат вашего запроса,

 create table #temp (Med varchar(40),Times varchar(20))
insert into #temp values

('PATIENT1 DRUG1',  '9:00AM')
,('PATIENT1 DRUG1',  '1:00PM')
,('PATIENT1 DRUG1',  '5:00PM')
,('PATIENT1 DRUG1',  '9:00PM')
,('PATIENT1 DRUG2',  '02:00AM')
  

Затем окончательный запрос,

 SELECT *
FROM
(
    SELECT Med, 
           Times
    FROM #temp
) AS src PIVOT(MAX(times) FOR times IN([00:00AM], 
                                       [01:00AM], 
                                       [02:00AM], 
                                       [9:00AM], 
                                       [1:00PM], 
                                       [5:00PM], 
                                       [9:00PM])) AS pvt;
DROP TABLE #temp;
  

Разные сроки будут иметь разные лекарства.Вам нужно записать все 24 hour временные параметры внутри PIVOT.

Также time format внутри PIVOT должен соответствовать вашему #Temp формату времени result ().