RE: AYUDA CON CONSULTA URGENTE

13/07/2004 - 19:49 por Ing. Bernardo Cordoba - Previmedic S.A. | Informe spam
Liliana:
Me podrias explicar como integro la funcion calcular edad a la consulta...
No he entendido bien..

gracias


"Liliana Sorrentino" <lsorrentino@mardelplata.gov.ar> escribió en el


mensaje

news:eoXSa6OZEHA.3480@TK2MSFTNGP11.phx.gbl...
> Hola Bernardo,
>
> La función para calcular edad va un poquito más en detalle que la que
> preparaste.
> Y después el query que la invoca, utilizando una tabla derivada en lugar
de
> la temporal.
> No conozco la información ni el volumen de la misma, así que el control


de

> performance queda en tus manos.
> Saludos... Liliana.
>
> CREATE FUNCTION calcularedad (@fecha datetime, @getdate datetime)


RETURNS

> smallint
> AS
> BEGIN
> DECLARE @edad smallint
> SELECT @edad = CASE WHEN MONTH( @fecha) > MONTH( @getdate)) OR
> MONTH( @fecha) = MONTH( @getdate) AND DAY(
@fecha)
> > DAY(@getdate))
> THEN YEAR( @getdate) - YEAR( @fecha) - 1
> ELSE YEAR( @getdate) - YEAR( @fecha) END
> RETURN @edad
> END
> GO
>
> SELECT
> ipsnombre,
> COUNT(case when sexo='M' and edad between 0 and 7 then sexo else null
> end) as Rango1M,
> COUNT(case when sexo='F' and edad between 0 and 7 then sexo else null
> end) as Rango1F,
> COUNT(case when sexo='M' and edad between 8 and 14 then sexo else null
> end) as Rango2M,
> COUNT(case when sexo='F' and edad between 8 and 14 then sexo else null
> end) as Rango2F,
> COUNT(case when sexo='M' and edad between 15 and 44 then sexo else null
> end) as Rango3M,
> COUNT(case when sexo='F' and edad between 15 and 44 then sexo else null
> end) as Rango3F,
> COUNT(case when sexo='M' and edad between 45 and 59 then sexo else null
> end) as Rango4M,
> COUNT(case when sexo='F' and edad between 45 and 59 then sexo else null
> end) as Rango4F,
> COUNT(case when sexo='M' and edad >` then sexo else null end) as
Rango5M,
> COUNT(case when sexo='F' and edad >` then sexo else null end) as
Rango5F,
> COUNT(case when sexo NOT IN('F','M') then sexo else null end) as


NOSEXO

> FROM (SELECT ipsnombre, afbsexo as sexo, calcularedad(afbfecnac,
getdate())
> as edad
> FROM afbenefi
> WHERE muncodigo='001' and depcodigo='13') AS persona_edad
> GROUP BY ipsnombre
> ORDER BY ipsnombre
>
>
>
> "Ing. Bernardo Cordoba - Previmedic S.A." <previmectg@enred.com>


escribió

en
> el mensaje news:ednrQ1HZEHA.2480@tk2msftngp13.phx.gbl...
> > Liliana, me parece bien esta consulta, de tanta vuelta que le di,


alfin

lo
> > realize utilizando case pero lo hago en la tabla temporal.
> >
> > me suena la idea tuya de hacer una funcion para calcular la edad y asi
> > elimino tener que crear una tabla emporal, pero como hago esto?


recuerda

> que
> > soy novato en transact sql.
> >
> > te envio el codigo que hice para que me arrojara lo que necesito:
> >
> > select ipscodigo as ips, afbsexo as sexo, afbfecnac as fechanac,
> > case
> > when month(afbfecnac) < month(getdate())
> > then
> > (year(getdate())-year(afbfecnac))
> > else
> > (year(getdate())-year(afbfecnac))-1
> > end as edad
> > into #beneficiarios
> > from afbenefi
> > where muncodigo='001' and depcodigo='13'
> >
> > select
> > A.ipsnombre,
> > COUNT(case when B.sexo='M' then case when B.edad between 0 and 7 then
> > B.sexo else null end else null end)as Rango1M,
> > COUNT(case when B.sexo='F' then case when B.edad between 0 and 7 then
> > B.sexo else null end else null end)as Rango1F,
> > COUNT(case when B.sexo='M' then case when B.edad between 8 and 14


then

> > B.sexo else null end else null end)as Rango2M,
> > COUNT(case when B.sexo='F' then case when B.edad between 8 and 14


then

> > B.sexo else null end else null end)as Rango2F,
> > COUNT(case when B.sexo='M' then case when B.edad between 15 and 44


then

> > B.sexo else null end else null end)as Rango3M,
> > COUNT(case when B.sexo='F' then case when B.edad between 15 and 44


then

> > B.sexo else null end else null end)as Rango3F,
> > COUNT(case when B.sexo='M' then case when B.edad between 45 and 59


then

> > B.sexo else null end else null end)as Rango4M,
> > COUNT(case when B.sexo='F' then case when B.edad between 45 and 59


then

> > B.sexo else null end else null end)as Rango4F,
> > COUNT(case when B.sexo='M' then case when B.edad >` then B.sexo


else

> null
> > end else null end)as Rango5M,
> > COUNT(case when B.sexo='F' then case when B.edad >` then B.sexo


else

> null
> > end else null end)as Rango5F,
> > COUNT(case when B.sexo NOT IN('F','M') then B.sexo else null end)as
> NOSEXO
> > from #beneficiarios as B, dbgenerales..geipsesp as A
> > where B.ips=A.ipscodigo
> > group by A.ipsnombre
> > order by A.ipsnombre
> >
> >
> > ips rango1 rango2
> > M | F M | F
> >
> >
> > "Liliana Sorrentino" <lsorrentino@mardelplata.gov.ar> escribió en el
> mensaje
> > news:O0VDjcFZEHA.2456@TK2MSFTNGP10.phx.gbl...
> > > Hola Marcos,
> > > Suponiendo que tenés entonces una función para calcular la edad,
podrías
> > > hacer por ejemplo:
> > >
> > > SELECT ips, sexo, SUM(CASE WHEN calcularedad(nacimiento, getdate())
> > BETWEEN
> > > 0
> > > AND 7 THEN 1 END) as '0-7',
> > > SUM(CASE WHEN calcularedad(nacimiento, getdate()) BETWEEN 8 AND
> > > 14 THEN 1 END) as '8-14',
> > > SUM(CASE WHEN calcularedad(nacimiento, getdate()) BETWEEN 15 AND
> > > 44 THEN 1 END) as '15-44',
> > > SUM(CASE WHEN calcularedad(nacimiento, getdate()) BETWEEN 45 AND
> > > 59 THEN 1 END) as '45-59',
> > > SUM(CASE WHEN calcularedad(nacimiento, getdate()) > 59 THEN 1 END)


as

> '>
> > > 59'
> > > FROM tabla
> > > GROUP BY ips, sexo
> > >
> > > Saludos... Liliana.
> > >
> > >
> > > "Ing. Bernardo Cordoba - Previmedic S.A." <previmectg@enred.com>
> escribió
> > en
> > > el mensaje news:O2UpVIFZEHA.2840@TK2MSFTNGP11.phx.gbl...
> > > > necesito realizar un informe de cantidad de pacientes agrupados


por

> IPS
> > y
> > > > por Sexo en rangos de edad que pertenezcan a Cartagena
> (muncodigo='001'
> > y
> > > > depcodigo='13')
> > > >
> > > > Rango 1 => 0-7 años
> > > > Rango 2 => 8-14 años
> > > > Rango 3 => 15-44 años
> > > > Rango 4 => 45-59 años
> > > > Rango 5 => mayores a 59 años
> > > >
> > > > //Para lo anterior creo una tabla temporal donde calculo la edad


de

> los
> > > > pacientes, ademas coloco los campos que necesito.
> > > > select ipscodigo as ips, afbsexo as sexo, afbfecnac as fechanac,
> > > > case
> > > > when month(afbfecnac) < month(getdate())
> > > > then
> > > > (year(getdate())-year(afbfecnac))
> > > > else
> > > > (year(getdate())-year(afbfecnac))-1
> > > > end as edad -- Calculo de la edad, teniendo en cuenta el
mes
> > > > presente, asumo como error el dia.
> > > > into #beneficiarios
> > > > from afbenefi
> > > > where muncodigo='001' and depcodigo='13'
> > > >
> > > > obteniendo este resultado
> > > > (32741 filas afectadas)
> > > >
> > > > luego me toca hacer 5 consultas para los rangos de edad
> > > >
> > > > select ips, sexo, count(sexo) as cantidad
> > > > from #beneficiarios
> > > > where edad between 15 and 44
> > > > group by sexo, ips
> > > > order by ips,sexo
> > > >
> > > > ips sexo cantidad
> > > > 0996 63
> > > > 0996 F 1187
> > > > 0996 M 623
> > > > 1100100435 F 150
> > > > 1100100435 M 32
> > > > 1300101439 1
> > > > 1300101439 F 3861
> > > > 1300101439 M 1955
> > > > 1609 F 2228
> > > > 1609 M 944
> > > >
> > > > (10 filas afectadas)
> > > >
> > > > El problema esta en que toca hacer tantas consultas sean


necesarias

> > segun
> > > > los rangos de edades, ademas de esto el informe se debe presentar


en

> el
> > > > siguiente informe ya que es para la actualizacion de una web.
> > > >
> > > >
> > > > IPS SEXO RANGO 1 RANGO 2 RANGO 3 RANGO 4 RANGO 5
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


 

Leer las respuestas

#1 Liliana Sorrentino
13/07/2004 - 19:53 | Informe spam
Hola Bernardo,

En el FROM de la consulta no está usando la tabla afbenefi, sino
persona_edad, es lo que se llama "tabla derivada".
Uno de los datos de esa tabla persona_edad, es la edad calculada en la
función a la que está haciendo referencia, esa es toda la vinculación que
necesitás una vez que la función está creada como te indicaba en el ejemplo.

Saludos... Liliana.

"Ing. Bernardo Cordoba - Previmedic S.A." escribió en
el mensaje news:
Liliana:
Me podrias explicar como integro la funcion calcular edad a la consulta...
No he entendido bien..

gracias

> "Liliana Sorrentino" escribió en el
mensaje
> news:
> > Hola Bernardo,
> >
> > La función para calcular edad va un poquito más en detalle que la que
> > preparaste.
> > Y después el query que la invoca, utilizando una tabla derivada en


lugar
> de
> > la temporal.
> > No conozco la información ni el volumen de la misma, así que el


control
de
> > performance queda en tus manos.
> > Saludos... Liliana.
> >
> > CREATE FUNCTION calcularedad (@fecha datetime, @getdate datetime)
RETURNS
> > smallint
> > AS
> > BEGIN
> > DECLARE @edad smallint
> > SELECT @edad = CASE WHEN MONTH( @fecha) > MONTH( @getdate)) OR
> > MONTH( @fecha) = MONTH( @getdate) AND DAY(
> @fecha)
> > > DAY(@getdate))
> > THEN YEAR( @getdate) - YEAR( @fecha) - 1
> > ELSE YEAR( @getdate) - YEAR( @fecha) END
> > RETURN @edad
> > END
> > GO
> >
> > SELECT
> > ipsnombre,
> > COUNT(case when sexo='M' and edad between 0 and 7 then sexo else


null
> > end) as Rango1M,
> > COUNT(case when sexo='F' and edad between 0 and 7 then sexo else


null
> > end) as Rango1F,
> > COUNT(case when sexo='M' and edad between 8 and 14 then sexo else


null
> > end) as Rango2M,
> > COUNT(case when sexo='F' and edad between 8 and 14 then sexo else


null
> > end) as Rango2F,
> > COUNT(case when sexo='M' and edad between 15 and 44 then sexo else


null
> > end) as Rango3M,
> > COUNT(case when sexo='F' and edad between 15 and 44 then sexo else


null
> > end) as Rango3F,
> > COUNT(case when sexo='M' and edad between 45 and 59 then sexo else


null
> > end) as Rango4M,
> > COUNT(case when sexo='F' and edad between 45 and 59 then sexo else


null
> > end) as Rango4F,
> > COUNT(case when sexo='M' and edad >` then sexo else null end) as
> Rango5M,
> > COUNT(case when sexo='F' and edad >` then sexo else null end) as
> Rango5F,
> > COUNT(case when sexo NOT IN('F','M') then sexo else null end) as
NOSEXO
> > FROM (SELECT ipsnombre, afbsexo as sexo, calcularedad(afbfecnac,
> getdate())
> > as edad
> > FROM afbenefi
> > WHERE muncodigo='001' and depcodigo='13') AS persona_edad
> > GROUP BY ipsnombre
> > ORDER BY ipsnombre
> >
> >
> >
> > "Ing. Bernardo Cordoba - Previmedic S.A."
escribió
> en
> > el mensaje news:
> > > Liliana, me parece bien esta consulta, de tanta vuelta que le di,
alfin
> lo
> > > realize utilizando case pero lo hago en la tabla temporal.
> > >
> > > me suena la idea tuya de hacer una funcion para calcular la edad y


asi
> > > elimino tener que crear una tabla emporal, pero como hago esto?
recuerda
> > que
> > > soy novato en transact sql.
> > >
> > > te envio el codigo que hice para que me arrojara lo que necesito:
> > >
> > > select ipscodigo as ips, afbsexo as sexo, afbfecnac as fechanac,
> > > case
> > > when month(afbfecnac) < month(getdate())
> > > then
> > > (year(getdate())-year(afbfecnac))
> > > else
> > > (year(getdate())-year(afbfecnac))-1
> > > end as edad
> > > into #beneficiarios
> > > from afbenefi
> > > where muncodigo='001' and depcodigo='13'
> > >
> > > select
> > > A.ipsnombre,
> > > COUNT(case when B.sexo='M' then case when B.edad between 0 and 7


then
> > > B.sexo else null end else null end)as Rango1M,
> > > COUNT(case when B.sexo='F' then case when B.edad between 0 and 7


then
> > > B.sexo else null end else null end)as Rango1F,
> > > COUNT(case when B.sexo='M' then case when B.edad between 8 and 14
then
> > > B.sexo else null end else null end)as Rango2M,
> > > COUNT(case when B.sexo='F' then case when B.edad between 8 and 14
then
> > > B.sexo else null end else null end)as Rango2F,
> > > COUNT(case when B.sexo='M' then case when B.edad between 15 and 44
then
> > > B.sexo else null end else null end)as Rango3M,
> > > COUNT(case when B.sexo='F' then case when B.edad between 15 and 44
then
> > > B.sexo else null end else null end)as Rango3F,
> > > COUNT(case when B.sexo='M' then case when B.edad between 45 and 59
then
> > > B.sexo else null end else null end)as Rango4M,
> > > COUNT(case when B.sexo='F' then case when B.edad between 45 and 59
then
> > > B.sexo else null end else null end)as Rango4F,
> > > COUNT(case when B.sexo='M' then case when B.edad >` then B.sexo
else
> > null
> > > end else null end)as Rango5M,
> > > COUNT(case when B.sexo='F' then case when B.edad >` then B.sexo
else
> > null
> > > end else null end)as Rango5F,
> > > COUNT(case when B.sexo NOT IN('F','M') then B.sexo else null end)as
> > NOSEXO
> > > from #beneficiarios as B, dbgenerales..geipsesp as A
> > > where B.ips=A.ipscodigo
> > > group by A.ipsnombre
> > > order by A.ipsnombre
> > >
> > >
> > > ips rango1 rango2
> > > M | F M | F
> > >
> > >
> > > "Liliana Sorrentino" escribió en el
> > mensaje
> > > news:
> > > > Hola Marcos,
> > > > Suponiendo que tenés entonces una función para calcular la edad,
> podrías
> > > > hacer por ejemplo:
> > > >
> > > > SELECT ips, sexo, SUM(CASE WHEN calcularedad(nacimiento,


getdate())
> > > BETWEEN
> > > > 0
> > > > AND 7 THEN 1 END) as '0-7',
> > > > SUM(CASE WHEN calcularedad(nacimiento, getdate()) BETWEEN 8 AND
> > > > 14 THEN 1 END) as '8-14',
> > > > SUM(CASE WHEN calcularedad(nacimiento, getdate()) BETWEEN 15 AND
> > > > 44 THEN 1 END) as '15-44',
> > > > SUM(CASE WHEN calcularedad(nacimiento, getdate()) BETWEEN 45 AND
> > > > 59 THEN 1 END) as '45-59',
> > > > SUM(CASE WHEN calcularedad(nacimiento, getdate()) > 59 THEN 1


END)
as
> > '>
> > > > 59'
> > > > FROM tabla
> > > > GROUP BY ips, sexo
> > > >
> > > > Saludos... Liliana.
> > > >
> > > >
> > > > "Ing. Bernardo Cordoba - Previmedic S.A."
> > escribió
> > > en
> > > > el mensaje news:
> > > > > necesito realizar un informe de cantidad de pacientes agrupados
por
> > IPS
> > > y
> > > > > por Sexo en rangos de edad que pertenezcan a Cartagena
> > (muncodigo='001'
> > > y
> > > > > depcodigo='13')
> > > > >
> > > > > Rango 1 => 0-7 años
> > > > > Rango 2 => 8-14 años
> > > > > Rango 3 => 15-44 años
> > > > > Rango 4 => 45-59 años
> > > > > Rango 5 => mayores a 59 años
> > > > >
> > > > > //Para lo anterior creo una tabla temporal donde calculo la edad
de
> > los
> > > > > pacientes, ademas coloco los campos que necesito.
> > > > > select ipscodigo as ips, afbsexo as sexo, afbfecnac as


fechanac,
> > > > > case
> > > > > when month(afbfecnac) < month(getdate())
> > > > > then
> > > > > (year(getdate())-year(afbfecnac))
> > > > > else
> > > > > (year(getdate())-year(afbfecnac))-1
> > > > > end as edad -- Calculo de la edad, teniendo en cuenta


el
> mes
> > > > > presente, asumo como error el dia.
> > > > > into #beneficiarios
> > > > > from afbenefi
> > > > > where muncodigo='001' and depcodigo='13'
> > > > >
> > > > > obteniendo este resultado
> > > > > (32741 filas afectadas)
> > > > >
> > > > > luego me toca hacer 5 consultas para los rangos de edad
> > > > >
> > > > > select ips, sexo, count(sexo) as cantidad
> > > > > from #beneficiarios
> > > > > where edad between 15 and 44
> > > > > group by sexo, ips
> > > > > order by ips,sexo
> > > > >
> > > > > ips sexo cantidad
> > > > > 0996 63
> > > > > 0996 F 1187
> > > > > 0996 M 623
> > > > > 1100100435 F 150
> > > > > 1100100435 M 32
> > > > > 1300101439 1
> > > > > 1300101439 F 3861
> > > > > 1300101439 M 1955
> > > > > 1609 F 2228
> > > > > 1609 M 944
> > > > >
> > > > > (10 filas afectadas)
> > > > >
> > > > > El problema esta en que toca hacer tantas consultas sean
necesarias
> > > segun
> > > > > los rangos de edades, ademas de esto el informe se debe


presentar
en
> > el
> > > > > siguiente informe ya que es para la actualizacion de una web.
> > > > >
> > > > >
> > > > > IPS SEXO RANGO 1 RANGO 2 RANGO 3 RANGO 4 RANGO 5
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Preguntas similares