none
Calcular idade e Agrupar por Décadas

    Question

  • Boas..
    Sei que é possivel calcular a idade, mas também que ele me agrupasse por décadas...


    <10   5
    10-20 10

    Não sei se me fiz entender..
    Obrigado desde já..

    Friday, January 11, 2008 4:51 PM

Answers

  • Usando a quey abaixo vai te trazer isto

     

     

     Sergio Fonseca wrote:

    SELECT

    CASE

    WHEN IDADE BETWEEN 1 and 10 the '0-10'

    WHEN IDADE BETWEEN 11 and 20 the '11-20'

    ELSE 'OUTROS'

    END,

    Count(*) as QTD

    FROM TABELA

    GROUP BY

    CASE

    WHEN IDADE BETWEEN 1 and 10 the '0-10'

    WHEN IDADE BETWEEN 11 and 20 the '11-20'

    ELSE 'OUTROS'

    END

    Friday, January 11, 2008 5:07 PM

All replies

  • Voce pode usar um case

     

    SELECT

    CASE

    WHEN IDADE BETWEEN 1 and 10 the '0-10'

    WHEN IDADE BETWEEN 11 and 20 the '11-20'

    ELSE 'OUTROS'

    END

    FROM TABELA

    Friday, January 11, 2008 4:56 PM
  • Não queria que ele me mostrasse se pertence aquela década, mas sim acumular e no fim mostrar a decada e o total de pessoas naquela decada
    Friday, January 11, 2008 4:58 PM
  • Para calular a idade:

     

    Exemplo de Itzik Ben-Gan da sql server magazzine;

     

     

    Create Table #Exemplos (codigo int, Data Datetime)

    Insert Into #Exemplos ( codigo,data) Values    (1, '1980-01-12')
    Insert Into #Exemplos ( codigo,data) Values (1, '2000-01-12')
    Insert Into #Exemplos ( codigo,data) Values  (1, '1975-01-12')

    SELECT  (CAST(CONVERT(CHAR(8),getdate(),112) AS INT)  - CAST(CONVERT(CHAR(8),data,112) AS INT)) / 10000 AS Age
    from #Exemplos

     

     

    agora vc. pode explicar melhor o esquema de agrupar por decada, qusl a ideia ?

     

     

    Abs;

     

     

     

    Friday, January 11, 2008 5:02 PM
  • SELECT

    CASE

    WHEN IDADE BETWEEN 1 and 10 the '0-10'

    WHEN IDADE BETWEEN 11 and 20 the '11-20'

    ELSE 'OUTROS'

    END,

    Count(*) as QTD

    FROM TABELA

    GROUP BY

    CASE

    WHEN IDADE BETWEEN 1 and 10 the '0-10'

    WHEN IDADE BETWEEN 11 and 20 the '11-20'

    ELSE 'OUTROS'

    END

    Friday, January 11, 2008 5:04 PM
  • A ideia é mostrar o numero de utentes por intervalo de idade..

    Exemplo

    Idade     N.º Utentes
    20-29           5
    30-39           10
    40-49           6

    Friday, January 11, 2008 5:05 PM
  • Usando a quey abaixo vai te trazer isto

     

     

     Sergio Fonseca wrote:

    SELECT

    CASE

    WHEN IDADE BETWEEN 1 and 10 the '0-10'

    WHEN IDADE BETWEEN 11 and 20 the '11-20'

    ELSE 'OUTROS'

    END,

    Count(*) as QTD

    FROM TABELA

    GROUP BY

    CASE

    WHEN IDADE BETWEEN 1 and 10 the '0-10'

    WHEN IDADE BETWEEN 11 and 20 the '11-20'

    ELSE 'OUTROS'

    END

    Friday, January 11, 2008 5:07 PM
  • Calculei a idade através desta fórmula
    DATEDIFF(Year, DataNascimento, GETDATE())

    Não há problema?
    Friday, January 11, 2008 5:11 PM
  •  

    sem problemas
    Friday, January 11, 2008 5:12 PM
  •  

    tem problemas sim, a por exemplo no meu caso 1975-12-08 se pegar date diff vai me dar 33 anos, mais na verdade tenho 32 veja o exemplo que postei foi a melhor forma de calculo de idade que ja vi ...

     

    Abs;

    Friday, January 11, 2008 5:16 PM
  • Colla, seguindo a sua sugestão eu pensei no caso de agrupar por décadas, algo do tipo:

     

    Criar uma tabela temporária ou local, onde fica armazenado as décadas início e fim:

     

    Code Block

    CREATE TABLE decadas (ini int, fim int)

     

     

    Nessa tabela ficam armazenadas as décadas.

     

    Em seguida criamos uma função pra calcular a idade, com seu código de exemplo.

     

    E depois criamos uma função onde checamos onde se encaixa cada Utente, o que acha?

     

    Code Block
    CREATE FUNCTION fn_decadas ....

     

     

     

    Ficaria uma solução mais limpa, reutilizável e fácil manutenção.

     

    Se precisar do código de exemplo da função me fala Vitor.

     

    Espero ter ajudado.

     

    Abraços,

    Friday, January 11, 2008 5:23 PM
  • Boas..
    Agradecia Rodrigo..
    Se me permitir rentabilizar o código, agradecia..

    Já agora..
    Substitui a função de data pela sugerida e dá-me o seguinte erro.
    Column 'UTENTES.DataNascimento' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

    Tenho assim:
        CASE
            WHEN (SELECT(CAST(CONVERT(CHAR(8),getdate(),112) AS INT)-CAST(CONVERT(CHAR(8),datanascimento,112)AS INT)) / 10000) BETWEEN 1 and 9 then '0 - 19'
    Friday, January 11, 2008 5:26 PM
  •  

    se o resultado puder ser por linhas, pode criar uma tabela para server de lookup, e fazer um join, mais em todo o caso pode se aplicar este recurso de pivot dinamica:

     

     

    segue exemplo de pivot dinamico.

     


     
    -- Esta funcao e para retornar somente o dia 01 de todos os meses
    CrEATE FUNCTION fn_RBMS_ReturnMonth(@Vdata as Datetime)
    RETURNS DateTime
    AS
    BEGIN
    return cast(Str(month(@Vdata)) + '/01/'+ ltrim(Str(year(@Vdata))) as
    SMALLDateTime)
    END
     
    go

    -- Cria uma Tabela de Exemplo
    Create Table #Dados (Idx int identity(1,1), Valor Numeric (19,2), Data DateTime)
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-01-01')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-02-01')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-04-01')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-05-01')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-01-02')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-05-07')
    Insert Into #Dados (Valor, Data) Values (150.10, '2004-01-08')
     
    Create Table #PivotTabela (CampoChave Int)
     
    Insert into #PivotTabela (CampoChave) Values (1) -- So para criar uma linha em branco
    Declare @DataI Datetime -- Sao Variaveis para fazer o loop
    Declare @DataF Datetime
    Select @DataI = Dbo.fn_RBMS_ReturnMonth(Min(Data)), @DataF = Dbo.fn_RBMS_ReturnMonth(Max(Data)) From #Dados
     
    -- Alimenta com a menor e a maior data para definir o range
    Declare @TotalMes Numeric(19,2)
    Declare @StringDDL Varchar(1000)
    While @DataI <= @DataF
    Begin
     Select @TotalMes = Sum(Valor) From #Dados Where
    Dbo.fn_RBMS_ReturnMonth(Data) = @DataI
     If @TotalMes = 0
     Begin
     Set @StringDDL = 'Alter Table #PivotTabela Add [' +
    Right(Convert(Char(10),@DataI,105),7) + '] Numeric(19,2) '
     Exec(@StringDDL)
     Set @StringDDL = 'Update #PivotTabela Set [' +
    Right(Convert(Char(10),@DataI,105),7) + '] = ' +
    convert(varchar(30),@Totalmes)
     Exec(@StringDDL)
     Set @TotalMes = 0
     End
    Set @DataI = DateAdd(m,1, @DataI)
     
    End
     
    Select * From #PivotTabela
     

     


    mais vai ter alterar para funcionar neste caso.

     

    Abs;

    Friday, January 11, 2008 5:32 PM
  • Boas..
    Só não percebi o que representa a variavel Valor da tabela #Dados
    Monday, January 14, 2008 9:24 AM
  • e so para exemplo vc. deve alterar o #dados por dados da sua tabela.

     

    Abs;

     

    Tuesday, January 15, 2008 12:08 PM
  • Bom, segue uma sugestão de como realizar o cálculo da idade:

     

    Code Block

    Create Function dbo.udf_CalcularIdade (@dtnascimento varchar(10))

    RETURNS int

    AS

    BEGIN

    Declare @ano int, @mes int, @dia int, @idade int;

    Set @mes = cast(month(getdate())As int);

    Set @dia = cast(day(getdate())As int);

    Set @ano = cast(year(getdate())As int);

    If (@ano >= cast(year(@dtnascimento) As int)) and (cast(month(@dtnascimento) As int) between 1 and 12)

    and (cast(day(@dtnascimento) As int) between 1 and 31)

    Begin

    If (cast(month(@dtnascimento) As int) = @mes)

    Begin

    If (cast(day(@dtnascimento) As int) = @dia) or (@dia > cast(day(@dtnascimento) As int))

    Set @idade = @ano - cast(year(@dtnascimento) As int)

    Else

    Set @idade = (@ano - cast(year(@dtnascimento) As int) - 1)

    End

    Else If (@mes > cast(month(@dtnascimento) As int))

    Begin

    Set @idade = @ano - cast(year(@dtnascimento) As int);

    End

    Else

    Begin

    Set @idade = (@ano - cast(year(@dtnascimento) As int) - 1)

    End

    End

    RETURN (@idade)

    END;

     

     

    Vou preparar um exemplo de como saber a década de cada um, ok?

     

    Abraços,

    Wednesday, January 16, 2008 2:03 PM