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