#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 ().