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
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Preguntas similare

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
> > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#2 Ing. Bernardo Cordoba - Previmedic S.A.
14/07/2004 - 15:20 | Informe spam
Listo, me parece muy bien... veo que tienes mucha experiencia en esto, veo
que con tigo puedo aprender mucho...

Ahora si entiendo el codigo, me puse ha analizarlo, pero cuando lo corro en
SQL (analizador de consultas me arroja el siguiente error:

"calcularedad" no es un nombre de funcion reconocida...

otra cosa corro el codigo o funcion donde creo el objeto calcularedad
y me dice que ya hay una en la base de dtaos, me imagino que esta se creo
cuando corry el query, como la elimino de la base de datos?


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 ipscodigo,
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 ipscodigo, afbsexo as sexo, calcularedad(afbfecnac,getdate())as
edad
FROM afbenefi
WHERE muncodigo='001' and depcodigo='13') AS persona_edad
GROUP BY ipscodigo
ORDER BY ipscodigo

Tu perdona por tanto abuso de tu ayuda...

Bernardo Cordoba

"Liliana Sorrentino" escribió en el mensaje
news:
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.
> > >




> > >
> > > 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
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#3 Liliana Sorrentino
14/07/2004 - 15:44 | Informe spam
Hola Bernardo,
Hay muchos compañeros en este grupo que con gusto te ayudarán, y de los que
aprendo algo cada día.

Fijate de llamar a la función con el nombre completo:
BasedeDatos.Propietario.NombreFuncion.
Para borrar una función, DROP FUNCTION NombreFunción.
En la ayuda encontrarás mucha información.

Saludos... Liliana.

"Ing. Bernardo Cordoba - Previmedic S.A." escribió en
el mensaje news:
Listo, me parece muy bien... veo que tienes mucha experiencia en esto, veo
que con tigo puedo aprender mucho...

Ahora si entiendo el codigo, me puse ha analizarlo, pero cuando lo corro


en
SQL (analizador de consultas me arroja el siguiente error:

"calcularedad" no es un nombre de funcion reconocida...

otra cosa corro el codigo o funcion donde creo el objeto calcularedad
y me dice que ya hay una en la base de dtaos, me imagino que esta se creo
cuando corry el query, como la elimino de la base de datos?


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 ipscodigo,
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 ipscodigo, afbsexo as sexo,


calcularedad(afbfecnac,getdate())as
edad
FROM afbenefi
WHERE muncodigo='001' and depcodigo='13') AS persona_edad
GROUP BY ipscodigo
ORDER BY ipscodigo

Tu perdona por tanto abuso de tu ayuda...

Bernardo Cordoba

"Liliana Sorrentino" escribió en el


mensaje
news:
> 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.
> > > >




> > > >
> > > > 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
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>



Respuesta Responder a este mensaje
#4 Miguel Egea
14/07/2004 - 20:07 | Informe spam
Buenas bernardo y con permiso de liliana
Ejecuta esta instruccio´n y dinos que devuelve

select name,user_name(uid) from sysobjects where xtype ='fn'


-

Miguel Egea Gómez
Webmaster de PortalSQL

(lo de online sobra)
Brigada Anti-Cursores
Microsoft SqlServer M.V.P.

"Ing. Bernardo Cordoba - Previmedic S.A." escribió en
el mensaje news:
Te entiendo... por lo del correo..
Estoy verificando y en el enterprise manager de sql en la base de datos no
aparece la funcion que creo en el analizador de consultas, pero en esta
caundo visualizo los objetos si aparece. Obviamente actualizando el
anterior.

Ya habia encontrado como eliminar una funcion creada en el query, pero igual
no me deja utilizarla,

FROM (SELECT ipscodigo, afbsexo as sexo, calcularedad(afbfecnac,getdate())as
edad

Debo hacer esto dbafiliados.calcularedad(afbfecnac,getdate()) as edad
Pero al hacerlo iguam me sale el error "El nombre del objeto
dbafiliados.calcularedad no es valido"

Cuando corro el query para generar la funcion esta me sale Correcto..

El problema es cuando lo utilizo...

BCG


"Liliana Sorrentino" escribió en el mensaje
news:
Hola Bernardo,
Hay muchos compañeros en este grupo que con gusto te ayudarán, y de los


que
aprendo algo cada día.

Fijate de llamar a la función con el nombre completo:
BasedeDatos.Propietario.NombreFuncion.
Para borrar una función, DROP FUNCTION NombreFunción.
En la ayuda encontrarás mucha información.

Saludos... Liliana.

"Ing. Bernardo Cordoba - Previmedic S.A." escribió


en
el mensaje news:
> Listo, me parece muy bien... veo que tienes mucha experiencia en esto,


veo
> que con tigo puedo aprender mucho...
>
> Ahora si entiendo el codigo, me puse ha analizarlo, pero cuando lo corro
en
> SQL (analizador de consultas me arroja el siguiente error:
>
> "calcularedad" no es un nombre de funcion reconocida...
>
> otra cosa corro el codigo o funcion donde creo el objeto calcularedad
> y me dice que ya hay una en la base de dtaos, me imagino que esta se


creo
> cuando corry el query, como la elimino de la base de datos?
>
>
> 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 ipscodigo,
> 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 ipscodigo, afbsexo as sexo,
calcularedad(afbfecnac,getdate())as
> edad
> FROM afbenefi
> WHERE muncodigo='001' and depcodigo='13') AS persona_edad
> GROUP BY ipscodigo
> ORDER BY ipscodigo
>
> Tu perdona por tanto abuso de tu ayuda...
>
> Bernardo Cordoba
>
> "Liliana Sorrentino" escribió en el
mensaje
> news:
> > 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.
> > > > >
>
>
>
>
> > > > >
> > > > > 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
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida