Usuário com melhor resposta
Calcular idade e Agrupar por Décadas

Pergunta
-
Respostas
-
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
Todas as Respostas
-
-
-
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 #Exemplosagora vc. pode explicar melhor o esquema de agrupar por decada, qusl a ideia ?
Abs;
-
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
-
-
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
-
-
-
-
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 BlockCREATE 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 BlockCREATE 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,
-
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' -
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;
-
-
-
Bom, segue uma sugestão de como realizar o cálculo da idade:
Code BlockCreate
Function dbo.udf_CalcularIdade (@dtnascimento varchar(10))RETURNS
intAS
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,