Check the number of people per age

1

How do you check the total number of people in the 0-5 age group, and if you do not have any children with a certain age, please report 0;

select idade, count(*) as qtd from pessoa group by idade order by idade

example of the current problem

+-----------+--------+
|   idade   |   qtd  |
+-----------+--------+
|     0     |    3   |
+-----------+--------+ 
|     3     |    7   |
+-----------+--------+ 
|     5     |   11   |
+-----------+--------+ 

Example of how I need the data

+-----------+--------+
|   idade   |   qtd  |
+-----------+--------+
|     0     |    3   |
+-----------+--------+ 
|     1     |    0   |
+-----------+--------+ 
|     2     |    0   |
+-----------+--------+ 
|     3     |    7   |
+-----------+--------+ 
|     4     |    0   |
+-----------+--------+ 
|     5     |   11   |
+-----------+--------+ 
    
asked by anonymous 17.06.2016 / 21:43

2 answers

1

You can use the between to filter the age range you want.

create PROCEDURE BuscarTotalIdadePorFaixa
    @iniIdade int, 
    @fimIdade int
AS
BEGIN
    SET NOCOUNT ON;

    declare  @pessoa table(idade int, qtd  int)
    declare  @pessoaAux table(idade int, qtd  int)


    insert into @pessoa values
    (0,1),(1,1),(1,1),(1,1),(2,1),(2,1),(2,1),(2,1),(2,1),
    (4,1),(5,1),(5,1),(5,1),(6,1),(6,1),(7,1),(8,1),(8,1),(8,1),(8,1)

    declare @Idade int = @iniIdade;

    while (@Idade <= @fimIdade)
    begin
        print @Idade
        insert into @pessoaAux values (@Idade , 0); 
        set @Idade = @Idade + 1;
    end

    select idade , 0 from @pessoaAux pAux
    where not exists (select idade from @pessoa P where P.idade = pAux.idade)
    union all
    select idade, count(*) as qtd 
    from @pessoa 
    group by idade 
    having  idade between @iniIdade and @fimIdade
    order by idade

END
    
17.06.2016 / 21:59
0

As a very small set of ages ranging from zero to five years, ORACLE has a very interesting solution for you to do this with a command called merge that simply is: you have a table with qtde-zeroed data, varying age from 0 to 5 and another one that only has the data of fact and for the ages that do not exist, has no record (as in your case).

There may be a similar command in MySQL. I do not know, but it might exist.

See how interesting:

CREATE TABLE TEMP_IDADES (
  IDADE NUMBER,
  QTDE NUMBER
);

INSERT INTO TEMP_IDADES VALUES (0,0);
INSERT INTO TEMP_IDADES VALUES (1,0);
INSERT INTO TEMP_IDADES VALUES (2,0);
INSERT INTO TEMP_IDADES VALUES (3,0);
INSERT INTO TEMP_IDADES VALUES (4,0);
INSERT INTO TEMP_IDADES VALUES (5,0);

SELECT * FROM TEMP_IDADES;

-- nesta estao os dados reais
CREATE TABLE IDADES (
  IDADE NUMBER,
  QTDE NUMBER
);

INSERT INTO IDADES VALUES (4,30);
INSERT INTO IDADES VALUES (5,20);

SELECT * FROM IDADES;

-- MERGE DAS TABELAS COM AS SITUACOES ATUALIZA OU INSERE.


MERGE INTO TEMP_IDADES TEMPORARIA
   USING (SELECT IDADE, QTDE FROM IDADES) REAIS
   ON (TEMPORARIA.IDADE = REAIS.IDADE)
   WHEN MATCHED THEN 
      UPDATE SET TEMPORARIA.qtde = REAIS.qtde
   WHEN NOT MATCHED THEN 
      INSERT (TEMPORARIA.QTDE, TEMPORARIA.IDADE)
     VALUES (REAIS.QTDE,REAIS.IDADE);

SELECT * FROM TEMP_IDADES;

    
18.06.2016 / 03:17