SQL - Me estoy volviendo loco

   
Vista:

Me estoy volviendo loco

Publicado por Matias (4 intervenciones) el 16/07/2010 09:30:13
Hola, me estoy volviendo loco con una query, a ver si alguien me puede "iluminar".

Tengo 2 tablas:

TABLA 1: Hospitales
TABLA 2: Visitas

Campos TABLA 1: ID Hospital,Nombre Hospital
Campos TABLA 2: ID Visita,Fecha Visita,ID Hospital

Estoy intentando sacar el nº de visitas por Hospital con el siguiente formato:

Hospitales | Enero | Febrero | Marzo | Abril | ...

HOSPITAL 1 10 2 5 19 ...
HOSPITAL 2 14 4 3 35 ...
HOSPITAL 3 17 3 8 41 ...
HOSPITAL 4 20 9 6 12 ...
....

Hace días que estoy con esto y no logro encontrar la solucion. Sé como sacar el listado en
el formato que quiero, pero lo que no me está saliendo es como hacer que me muestre el
nº de visitas que le corresponde a cada hospital, lo mejor que me ha salido es mostrarme el
mismo nº de visitas por mes para todos los hospitales lo cual no esta bien.

Agradezco enormemente cualquie tipo de orientación/ayuda sobre como logra esto.

Muchas Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Me estoy volviendo loco

Publicado por Leonardo Josue (877 intervenciones) el 16/07/2010 16:35:54
Buenos días Matías, no mencionas en tu post qué manejador de base de datos, así es que te dejo cómo sería en SQL Server y si utilizas algún otro manejador pues será cuestión que la adecues un poco. Creo que puedes obtener lo que necesitas con lo siguiente:

select
h.nombre_hospital as Hospital,
Sum(case when (datepart(month, v.fecha) = 1) then 1 else 0 end) as Enero,
Sum(case when (datepart(month, v.fecha) = 2) then 1 else 0 end) as Febrero,
Sum(case when (datepart(month, v.fecha) = 3) then 1 else 0 end) as Marzo,
Sum(case when (datepart(month, v.fecha) = 4) then 1 else 0 end) as Abril,
Sum(case when (datepart(month, v.fecha) = 5) then 1 else 0 end) as Mayo,
Sum(case when (datepart(month, v.fecha) = 6) then 1 else 0 end) as Junio,
Sum(case when (datepart(month, v.fecha) = 7) then 1 else 0 end) as Julio,
Sum(case when (datepart(month, v.fecha) = 8) then 1 else 0 end) as Agosto,
Sum(case when (datepart(month, v.fecha) = 9) then 1 else 0 end) as Septiembre,
Sum(case when (datepart(month, v.fecha) = 10) then 1 else 0 end) as Octubre,
Sum(case when (datepart(month, v.fecha) = 11) then 1 else 0 end) as Noviembre,
Sum(case when (datepart(month, v.fecha) = 12) then 1 else 0 end) as Diciembre
from hospitales h
inner join visitas v on v.id_hospital = h.id_hospital
group by h.nombre_hospital

Saludos y si tienes algún problema con la consulta lo comentas en el foro para tratar de ayudarte.

Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Me estoy volviendo loco

Publicado por Matias (4 intervenciones) el 19/07/2010 08:32:33
Perdon, olvide mencionar el manejador de BD, es SQL Server. Leo voy a probar lo que me comentas, aunque tengo una pregunta, en que momento realizas la suma de visitas o sumas fechas?, porque hay que tener en cuenta que en un mismo día puede haber más de una visita....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Me estoy volviendo loco

Publicado por Matias (4 intervenciones) el 19/07/2010 11:59:20
Hola Leo, me ha funcionado, muchas gracias.

Una pregunta, si quiero sacar visitas de un período en concreto (por ejemplo: desde septiembre de 2009 a Junio 2010) y que me lo muestre de la misma forma (una columna por mes), ¿como lo hago?, porque si especifico un rango de fecha en WHERE (2009-09-01 a 2010-07-01) no sale la info correcta, y no me doy cuenta por que.

Por lo demás ha funcionado todo perfecto. He especificado que year(v.fecha)=2010 y me ha mostrado los datos correctos, el único problema que tengo ahora es el que te comento arriba, no logro hacer que me muestre las visitas por hospital para períodos de fecha en concreto.

Muchas gracias por tu ayuda.

Saludos,
Matías
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Me estoy volviendo loco

Publicado por Leonardo Josue (877 intervenciones) el 20/07/2010 16:51:12
Hola, Matías, me alegra que te haya servido el código que te mandé, sigues sin mencionar qué manejador de BD estás utilizando, pero como te funcionó el código voy a seguir suponiendo que se trata de SQL Server, ahora bien, para el manejo de rango fechas en SQL Server puedes utilizar el operador BETWEEN, especificando el rango de fechas que deseas analizar. Lo único con lo que hay que tener cuidado es con el manejo de la hora y minuto, dado que el tipo DATETIME guarda dia, mes, año, hora, minuto y segundo... lo que necesitas hacer es poner lo siguiente en la sección WHERE:

convert(datetime, convert(varchar, fecha, 103), 103) between
convert(datetime, '01/09/2009', 103) and convert(datetime, '30/06/2010', 103)

Ojo, la función between arroja todos los registros comprendidos entre el rango, incluyendo el límite. En tu post estabas colocando 2010/07/01, pero si colocas esto también te traería los registros del primero de Julio de 2010, por lo que resta sería más o menos lo mismo, lo único que agregué fue comparar también la parte del año y no solo del mes, la consulta quedaría más o menos así.

select
h.nombre_hospital as Hospital,
Sum(case when (datepart(month, v.fecha) = 9 and datepart(year, v.fecha) = 2009)
then 1 else 0 end) as Septiembre_2009,
Sum(case when (datepart(month, v.fecha) = 10 and datepart(year, v.fecha) = 2009)
then 1 else 0 end) as Octubre_2009,
Sum(case when (datepart(month, v.fecha) = 11 and datepart(year, v.fecha) = 2009)
then 1 else 0 end) as Noviembre_2009,
Sum(case when (datepart(month, v.fecha) = 12 and datepart(year, v.fecha) = 2009)
then 1 else 0 end) as Diciembre_2009,
Sum(case when (datepart(month, v.fecha) = 1 and datepart(year, v.fecha) = 2010)
then 1 else 0 end) as Enero_2010,
Sum(case when (datepart(month, v.fecha) = 2 and datepart(year, v.fecha) = 2010)
then 1 else 0 end) as Febrero_2010,
Sum(case when (datepart(month, v.fecha) = 3 and datepart(year, v.fecha) = 2010)
then 1 else 0 end) as Marzo_2010,
Sum(case when (datepart(month, v.fecha) = 4 and datepart(year, v.fecha) = 2010)
then 1 else 0 end) as Abril_2010,
Sum(case when (datepart(month, v.fecha) = 5 and datepart(year, v.fecha) = 2010)
then 1 else 0 end) as Mayo_2010,
Sum(case when (datepart(month, v.fecha) = 6 and datepart(year, v.fecha) = 2010)
then 1 else 0 end) as Junio_2010
from hospitales h
inner join visitas v on v.id_hospital = h.id_hospital
where
convert(datetime, convert(varchar, v.fecha, 103), 103) between
convert(datetime, '01/09/2009', 103) and convert(datetime, '30/06/2010', 103)
group by h.nombre_hospital

Cualquier cosa lo comentas en el foro y lo vemos.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Me estoy volviendo loco

Publicado por jams (15 intervenciones) el 16/07/2010 21:17:59
Que manejador de base datos usas??

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar