Fórum Intervalo de Datas #28415
24/04/2006
0
Tenho uma tabela que tem os seguintes campos: INICIO (DATE), FIM (DATE), ID (NUMBER).
Supondo que eu tenha o seguinte registro:
INICIO: 01/02/1990
FIM: 01/02/1995
ID: 2
Como eu poderia fazer um select count que me retornasse os anos de 1990 a 1995? Há alguma maneira?
Obrigado
Marcoantoniorocha
Curtir tópico
+ 0Posts
24/04/2006
Rosterne
não sei se é isso que você quer. Abaixo segue um select que conta quandos registros têm na tabela com data inicio no ano de 90 e data de fim no ano de 95.
select count(*) from i where to_char(inicio, ´yyyy´)=´1990´ and to_char(fim, ´yyyy´)=´1995´
Abraço.
Gostei + 0
24/04/2006
Rosterne
não sei se é isso que você quer. Abaixo segue um select que conta quantos registros têm na tabela com data inicio no ano de 90 e data de fim no ano de 95.
select count(*) from i where to_char(inicio, ´yyyy´)=´1990´ and to_char(fim, ´yyyy´)=´1995´
Abraço.
Gostei + 0
24/04/2006
Marcoantoniorocha
Eu gostaria que retornasse algo assim:
ANO QTD ---- ------------ 1980 1 1981 10 1982 1 1983 0 1984 0 1985 0 1986 0 1987 2 1988 0 1989 0 1990 0
Eu consigo contar e agrupar os registros, mas não consigo exibir as linhas onde a contagem seja zero.
Obrigado
Gostei + 0
25/04/2006
Rosterne
O que entendi, é que vc quer mostrar aqueles anos que não têm na tabela, ou seja, após o agrupamento dos dados os anos sem registros devem retornar a quantidade de zero.
Fiz o seguinte, criei uma tabela LISTA, que será a que contém uma lista de ano, no meu caso de 1980 à 1990. Dessa tabela é chamado os dados dos anos que não contêm na tabela PRINCIPAL.
Abaixo segue um exemplo de como ficaria, mesmo não sendo o que você quer pode te abrir um caminho.
EX:
select count(*) as ´Qtd´, to_number(to_char(inicio, ´rrrr´), 9999) as ´Ano´ from PRINCIPAL
group by to_number(to_char(inicio, ´rrrr´), 9999)
union
select 0 as ´Qtd´ ,to_number(to_char(ano, ´rrrr´), 9999) as ´Ano´ from LISTA where
to_number(to_char(ano, ´rrrr´), 9999)
not in (select to_number(to_char(inicio, ´rrrr´), 9999) as ´Ano´ from PRINCIPAL
group by to_number(to_char(inicio, ´rrrr´), 9999))
order by 2
Abraço.
Gostei + 0
25/04/2006
Marcoantoniorocha
Eu tentei essa abordagem também mas, infelizmente, não posso recorrer à criação de outra tabela.
Obrigado pela ajuda. Esse é um exercício de uma das minhas listas da disciplina de Laboratório de Base de Dados. Não consegui resolver, apanhei bastante mas descobri várias coisas interessantes.
Obrigado!
Gostei + 0
16/06/2006
Daneluti
select to_char(data,´YYYY´) ano, count(*) qtd
from tabela
where data between ´01/01/2000´ and ´01/01/2006´
group by to_char(data,´YYYY´)
order by 1;
Creio que seja o que está procurando.
Gostei + 0
16/06/2006
Daneluti
desculpe, faltou o resto...
com o comando de cima vc agrupa... se quer ver apenas os que tem contagem 0 vc faz assim:
select to_char(data,´YYYY´) ano, count(*) qtd
from tabela
where data between ´01/01/2000´ and ´01/01/2006´
group by to_char(data,´YYYY´)
having count(*) = 0
order by 1;
agora, para mostrar os anos que nao tenham nenhum registro eu nao sei te dizer se via SQL puro dá para fazer.... conheço formas de fazer isso usando funcoes ou entao utilizando 2 tabelas, como rosterne sugeriu.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)