Good afternoon ... I have this temporary table with the following structure:
create table ##PAC_ID_TEMP ( Id INT PRIMARY KEY IDENTITY(1,1),NHC varchar(30), Id_Ficha_IOS int) CREATE NONCLUSTERED INDEX Idx1 ON ##PAC_ID_TEMP(NHC);
Which I use to filter the information I want to show, this table I use in the following script.
select f.Id_Ficha_IOS,
e1.Id_Enfermedad, e1.Id_FichaIOS, e1.Id_Medicamento, e1.Id_Tipo_Enfermedad, e1.Id_TipoMedicamento,
e2.Id_Enfermedad, e2.Id_FichaIOS, e2.Id_Medicamento, e2.Id_Tipo_Enfermedad, e2.Id_TipoMedicamento,
e3.Id_Enfermedad, e3.Id_FichaIOS, e3.Id_Medicamento, e3.Id_Tipo_Enfermedad, e3.Id_TipoMedicamento,
e4.Id_Enfermedad, e4.Id_FichaIOS, e4.Id_Medicamento, e4.Id_Tipo_Enfermedad, e4.Id_TipoMedicamento,
e5.Id_Enfermedad, e5.Id_FichaIOS, e5.Id_Medicamento, e5.Id_Tipo_Enfermedad, e5.Id_TipoMedicamento,
e6.Id_Enfermedad, e6.Id_FichaIOS, e6.Id_Medicamento, e6.Id_Tipo_Enfermedad, e6.Id_TipoMedicamento
from ##PAC_ID_TEMP f
left join (
select e.Id_FichaIOS , Id_Enfermedad , Id_Tipo_Enfermedad , Id_TipoMedicamento , Id_Medicamento
from ##PAC_ID_TEMP f
left join Enfermedad_Paciente_FichaIOS e
on f.Id_Ficha_IOS = e.Id_FichaIOS
left join Medicamento_Administrado m
on e.Id_FichaIOS = m.Id_FichaIOS
)e1
on f.Id_Ficha_IOS = e1.Id_FichaIOS
left join
(
select e.Id_FichaIOS , Id_Enfermedad , Id_Tipo_Enfermedad , Id_TipoMedicamento , Id_Medicamento
from ##PAC_ID_TEMP f
left join Enfermedad_Paciente_FichaIOS e
on f.Id_Ficha_IOS = e.Id_FichaIOS
left join Medicamento_Administrado m
on e.Id_FichaIOS = m.Id_FichaIOS
)e2
on f.Id_Ficha_IOS = e2.Id_FichaIOS
left join (
select e.Id_FichaIOS , Id_Enfermedad , Id_Tipo_Enfermedad , Id_TipoMedicamento , Id_Medicamento
from ##PAC_ID_TEMP f
left join Enfermedad_Paciente_FichaIOS e
on f.Id_Ficha_IOS = e.Id_FichaIOS
left join Medicamento_Administrado m
on e.Id_FichaIOS = m.Id_FichaIOS
)e3
on f.Id_Ficha_IOS = e3.Id_FichaIOS
left join (
select e.Id_FichaIOS , Id_Enfermedad , Id_Tipo_Enfermedad , Id_TipoMedicamento , Id_Medicamento
from ##PAC_ID_TEMP f
left join Enfermedad_Paciente_FichaIOS e
on f.Id_Ficha_IOS = e.Id_FichaIOS
left join Medicamento_Administrado m
on e.Id_FichaIOS = m.Id_FichaIOS
)e4
on f.Id_Ficha_IOS = e4.Id_FichaIOS
left join (
select e.Id_FichaIOS , Id_Enfermedad , Id_Tipo_Enfermedad , Id_TipoMedicamento , Id_Medicamento
from ##PAC_ID_TEMP f
left join Enfermedad_Paciente_FichaIOS e
on f.Id_Ficha_IOS = e.Id_FichaIOS
left join Medicamento_Administrado m
on e.Id_FichaIOS = m.Id_FichaIOS
)e5
on f.Id_Ficha_IOS = e5.Id_FichaIOS
left join (
select e.Id_FichaIOS , Id_Enfermedad , Id_Tipo_Enfermedad , Id_TipoMedicamento , Id_Medicamento
from ##PAC_ID_TEMP f
left join Enfermedad_Paciente_FichaIOS e
on f.Id_Ficha_IOS = e.Id_FichaIOS
left join Medicamento_Administrado m
on e.Id_FichaIOS = m.Id_FichaIOS
)e6
on f.Id_Ficha_IOS = e6.Id_FichaIOS
group by f.Id_Ficha_IOS,
e1.Id_Enfermedad, e1.Id_FichaIOS, e1.Id_Medicamento, e1.Id_Tipo_Enfermedad, e1.Id_TipoMedicamento,
e2.Id_Enfermedad, e2.Id_FichaIOS, e2.Id_Medicamento, e2.Id_Tipo_Enfermedad, e2.Id_TipoMedicamento,
e3.Id_Enfermedad, e3.Id_FichaIOS, e3.Id_Medicamento, e3.Id_Tipo_Enfermedad, e3.Id_TipoMedicamento,
e4.Id_Enfermedad, e4.Id_FichaIOS, e4.Id_Medicamento, e4.Id_Tipo_Enfermedad, e4.Id_TipoMedicamento,
e5.Id_Enfermedad, e5.Id_FichaIOS, e5.Id_Medicamento, e5.Id_Tipo_Enfermedad, e5.Id_TipoMedicamento,
e6.Id_Enfermedad, e6.Id_FichaIOS, e6.Id_Medicamento, e6.Id_Tipo_Enfermedad, e6.Id_TipoMedicamento
What I hope to get with this script is a matrix like the following:
This result is expected considering that the data I have registered is the following:
Id_FichaIOS Id_Paciente Fecha Fecha_Enfermedad Id_Tipo_Enfermedad Id_Enfermedad
----------- ----------- ----------------------- ----------------------- ------------------ -------------
213 9607 2017-06-27 12:02:36.030 2017-05-24 00:00:00.000 3 13521
213 9607 2017-06-27 12:03:48.540 2017-05-24 00:00:00.000 3 68
213 9607 2017-06-27 12:04:52.200 2017-05-24 00:00:00.000 1 26
213 9607 2017-06-27 12:07:13.380 2017-05-24 00:00:00.000 2 2
213 9607 2017-06-27 12:09:24.630 2017-06-07 00:00:00.000 1 22
199 9560 2017-06-26 14:21:54.743 2017-05-11 00:00:00.000 2 6
199 9560 2017-06-26 14:24:43.243 2017-05-15 00:00:00.000 1 20
199 9560 2017-06-26 14:25:47.050 2017-05-31 00:00:00.000 2 2
However I have two problems, the structure of joins takes too long and I do not get the expected result, I get something like this ...
can you give me some guidance please.
Thank you.
------------------- edited at this point ------------------------ ------------
The script that you contributed to this:
select 'max (case when enf.Nro ='+ cast ( Conteo as varchar (5)) + ' ' +'then '+ ' ' + x.Campo+ ' ' +'else null end)' +x.Campo+ cast (Nro as varchar(2))
from
(
select Conteo, #row, Campo, Nro,Id_FichaIOS, Id_Enfermedad, Fecha_Enfermedad
from
(
select #vt.Conteo Conteo, tt.Campo Campo,#row
from ##ValoresPorTabla #vt
cross apply
(
select Campo ,
ROW_NUMBER() over ( order by Campo) #row
from TablaCampoInformes
where Tabla ='Enfermedad_Paciente_FichaIOS' and Campo <> 'Id_FichaIOS'
)tt
where #vt.Tabla ='Enfermedad_Paciente_FichaIOS'
--order by Conteo, #row
)n
left join
(
SELECT Id_FichaIOS,
Id_Enfermedad, Fecha_Enfermedad,
ROW_NUMBER() OVER (PARTITION BY Id_FichaIOS ORDER BY Id_Enfermedad) AS Nro
FROM Enfermedad_Paciente_FichaIOS --where Id_FichaIOS in (199,213)
)enf
on n.Conteo = enf.Nro
--
)x
order by Id_FichaIOS, Nro, #row
This section of the script tells me how many columns I should generate:
select #vt.Conteo Conteo, tt.Campo Campo,#row
from ##ValoresPorTabla #vt
cross apply
(
select Campo ,
ROW_NUMBER() over ( order by Campo) #row
from TablaCampoInformes
where Tabla ='Enfermedad_Paciente_FichaIOS' and Campo <> 'Id_FichaIOS'
)tt
My problem is that I can not generate the amount of case, indicated by this table
------------------------------ ESCRIPT TO SOLVE THE DYNAMIC AMOUNT OF CASE TO GENERATE ------- ------------------------
select 'max (case when enf.Nro = ' + cast(Conteo as varchar(4) )+ ' ' +'then enf.' + Campo + ' ' +'else null end) as ' +Campo+cast (Conteo as varchar(4))
from
(
select #vt.Conteo Conteo, tt.Campo Campo,#row
from ##ValoresPorTabla #vt
cross apply
(
select Campo ,
ROW_NUMBER() over ( order by Campo) #row
from TablaCampoInformes
where Tabla ='Enfermedad_Paciente_FichaIOS' and Campo <> 'Id_FichaIOS'
)tt
where #vt.Tabla ='Enfermedad_Paciente_FichaIOS'
--order by Conteo, #row
)x
order by Conteo, #row