Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

©JOÃO GABRIEL MARQUES

Agrupar registros por data

Recommended Posts

Pessoal não confundam ORDER com GROUP

 

ORDER apenas ordena os campos

 

GROUP agrupa ou seja ele junta os grupos para ser exibido apenas 1 valor sem repetir

 

como no caso de varias datas iguais ele agrupa e mostra apenas 1 data.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Fabyo, desculpe a demora para responder...o que acontece é o seguinte: o agrupamento serve para unir dois registros por intermédio de valores comuns em um determinado campo...se eu agrupar por hora, por ex, sempre vai existir a data repetida, porque nunca 1 notícia será publicada exatamente na mesma hora que outra, já que os segundos contam...embora eu tenha tentado agrupar por mais campos, mas é o q eu disse aí em cima...não rolou!!

 

O que eu não entendi foi esse "sum()"...como funciona isso? Para que serve exatamente?

 

 

Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gente, duas coisas:

 

1) Group by agrupa registros com informações calculadas.

Não é possível agrupar registros de uma consulta que retorne data e conteúdo da notícia, por exemplo. A não ser que o que se queira seja contar quantas notícias há em uma determinada data.

 

Isso funciona (dependendo do SGBD utilizado):

select data, count(notícia) from notícias

group by data

order by data desc

 

o resultado:

17/12/2008 - 5

16/12/2008 - 3

15/12/2008 - 7

 

------

 

Isso não funciona (para qualquer SGBD):

select data, notícia from notícias

group by data, notícia

order by data desc

 

*** a não ser que haja duas notícias no mesmo dia (e hora, dependendo do SGBD) exatamente iguais. Neste caso será agrupado. Mas é logicamente incorreto.

 

Espero ter ajudado

 

------

 

 

2) Quero aproveitar o assunto do João Gabriel, pois tenho um problema semelhante.

 

Uso o Firebird 1.5 e quero agrupar registros por data em um campo do tipo datetime, desprezando o tempo.

 

Atualmente, se faço a consulta

 

select data, count(notícia) from notícias

group by data

order by data

 

o resultado é

 

17/12/2008 10:00:01.0000 - 1

17/12/2008 10:00:03.0000 - 1

17/12/2008 10:00:05.0000 - 1

16/12/2008 10:00:01.0000 - 1

16/12/2008 10:00:07.0000 - 1

 

quando o que eu quero é

 

17/12/2008 - 3

16/12/2008 - 2

 

Já tentei converter de datetime para varchar(11) (reduzindo o tamanho do campo para 11 caracteres) e de volta para datetime, a fim de eliminar o tempo, deixando tudo zerado, assim:

 

select cast(cast(data as varchar(11) as timestamp) data, count(notícia) from notícias...

 

Mas deu erro de conversão.

 

Tem como fazer algo parecido com isso?

 

select data, count(notícia) from notícias

group by AlgumaFunçãoQueTransformeDatetimeEmApenasDate(data)

 

 

Já criei uma view para guardar o datetime em varchar(11) e então realizar a consulta, mas o formato da data retornado (17-DEC-2008) atrapalhou e não quero voltar aquela abordagem.

 

Já tentei de tudo que é jeito, mas o que me parece mais simples é realizar uma consulta, se possível, agrupando por data e desprezando o tempo. Mas não sei fazer isso. Qualquer ajuda é extremamente bem vinda.

 

Obrigado.

 

Luciano Gomes

Compartilhar este post


Link para o post
Compartilhar em outros sites
Olá Fabyo, desculpe a demora para responder...o que acontece é o seguinte: o agrupamento serve para unir dois registros por intermédio de valores comuns em um determinado campo...se eu agrupar por hora, por ex, sempre vai existir a data repetida, porque nunca 1 notícia será publicada exatamente na mesma hora que outra, já que os segundos contam...embora eu tenha tentado agrupar por mais campos, mas é o q eu disse aí em cima...não rolou!!

 

O que eu não entendi foi esse "sum()"...como funciona isso? Para que serve exatamente?

 

 

Valeu!

 

 

como falei esse sum serve para somar , o post anterior da pra você entender melhor

 

como ja tinha falado o group by serve para agrupar dados, com isso todos os campos que você ta selecionando tem que ser agrupados, no caso de quantidade use sum para somar, nomes simples nao precisa eles serao agrupados só colocar o group by neles tbm, no seu caso só nao vai dar para exibir a noticia porque cada noticia é diferente da outra entao nao tem como agrupar isso

 

seria legal você agrupar as noticias mas caso o cara queira ver a noticia você mostra um novo link para ele clicar e ver as noticias daquele grupo

 

estilo aquele [+] que você pode montar um menu tree

 

Luciano T. Gomes

 

você pode usar substring para agrupar só a data sem as horas, ou converter para dateYYYY-MM-DD e agrupar ela

e para exibir a data você formata e pronto

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.