Ir para conteúdo

POWERED BY:

Arquivado

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

PedBolo

Group By

Recommended Posts

Olá amigos! primeiro gostaria de dizer que fiquei feliz em ver que xanburzum faz parte do grupo de moderadores do forum, tenho crtza do grande profissional que ele é e da qualidade de suas respostas, parabéns Imasters.

 

Bom, eu criei um sistema que automatiza tudo pra mim, e já faz tempo que não crio Querys complexas, hj vi a necessidade de uma rotina relativamente simples, mas não consigo mais escreve-la, ai vai minha dúvida:

 

Criei um blog, onde a tabela de posts possue um campo para data no formato texto, eles são preenchidos da seguinte forma, ex: 15/9/2010 12:29:20

 

Quero exibir no menu arquivos, a relação dos anos dos posts com a relação dos meses dentro dela, e se possivel contar os posts de cada mês, ex:

 

Arquivos

2010

Março (2)

Fevereiro (5)

Janeiro (3)

 

2009

Dezembro (5)

Novembro (7)

Outubro (9)

 

seria interessante mostrar apenas os meses e anos que possuem posts!

 

Desde já agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade esse link que você passou é outra coisa, mas obrigado por responder.

 

Queria saber como montar o SQL que vai relacionar as opções de pesquisa de posts por mês e separa-los por ano também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

você esta errado, da sim!

 

Basta usar a cabeça, a instrução sql eu fazia mais ou menos assim

 

"SELECT Count(Id) FROM lancamentos WHERE MONTH(datacadastro) = " & mes & " and YEAR(datacadastro) = " & ano & ""

 

Fazia a contagem, a soma... usava for... for nos meses de 1 a 12 e usava o "mesmo" esquema daquele tópico, ou seja me baseava.

 

Funciona com certeza.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigo...

 

Eu fiquei ainda mais feliz, por nos dar a honra de frequentar esse fórum...

 

e tente passar os parâmetros de data direto na SQL

Compartilhar este post


Link para o post
Compartilhar em outros sites

dependendo da situacaun melhor usar um contatdor normal ou a clausula count do SQL, pois se o seu bd for muito grande o recordcount do objeto recordset pode apresentar uma certa queda de desempenho

e para usar o RecordCount , seu cursortype tem k ser recordset.CursorType = 3 (AdOpenDynamic)

 

exemplo:

<%
DIM mySQL, objRS
mySQL = "SELECT * FROM myTable" 
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open mySQL, objConn

' Count how many records exist
DIM iRecordCount
iRecordCount = 0
DO WHILE NOT objRS.EOF
iRecordCount = iRecordCount + 1
objRS.MoveNext
Loop

' Display result
Response.Write "(" & iRecordCount & ")"

objRS.Close
Set objRS = Nothing 
objConn.Close
Set objConn = Nothing
%> 

SQL COUNT

 

<!--#INCLUDE VIRTUAL="/includes/connection.asp" -->

<%
DIM mySQL, objRS
mySQL = "SELECT Count(*) AS intTotal FROM myTable" 
Set objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open recSQL, objConn

' Display result
Response.Write objRS("intTotal")

objRS.Close
Set objRS = Nothing 
objConn.Close
Set objConn = Nothing
%> 
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

No seu code eu não estou vendo recordset.CursorType = 3

 

e além disso não faz a separação, por ano e mes apresentando o total de cada...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não quero definir os meses e nem o ano, quero que a propria SQL já separe e organize os resultados.

 

Existem cerca de 90 posts na tabela entre 2009 e 2010.

 

Eu fiz assim:

 

"SELECT *, Count(Id) as totalAno FROM conteudo WHERE Ativo = 'ativo' GROUP BY Year(Data) ORDER BY Id DESC"

Response.write (Year(Rs("Data")) & "("&Rs("totalAno")&" posts)")

 

Quero que ele imprima na tela assim:

 

2010 (55 posts)

2009 (35 posts)

 

Mas ele está imprimindo assim:

 

2009 (90 posts)

 

Eu ainda queria que ele exibisse os meses e seus respectivos posts

 

2010 (55 posts)

Janeiro (x posts)

Fevereiro (x posts)

 

2009 (35 posts)

novembro (x posts)

dezembro (x posts)

 

 

mas se nem com o ano está funcionando, quanto mais mostrar os meses... sei que deve ter algo com group by e count ou algo que eu não me lembro mais como se faz

Compartilhar este post


Link para o post
Compartilhar em outros sites

você poderia fazer uma SubSelect no SQL (um select dentro de outro)

 

mais ou menos assim (adapte a sua tabela)

 

"SELECT *, Count(Id) as totalAno,

(SELECT COUNT(post) as totalmes FROM conteudo WHEre Ativo = 'ativo')as totalmes

FROM conteudo WHERE Ativo = 'ativo' GROUP BY Year(Data) ORDER BY Id DESC"

Compartilhar este post


Link para o post
Compartilhar em outros sites

No meu caso eu fiz um esquema POG

 

<%
option explicit

Function escrevemes(mes)
    If mes = 01 Then
        escrevemes = "Janeiro"
        Elseif mes = 02 Then escrevemes = "Fevereiro"
        Elseif mes = 03 Then escrevemes = "Março"
        Elseif mes = 04 Then escrevemes = "Abril"
        Elseif mes = 05 Then escrevemes = "Maio"
        Elseif mes = 06 Then escrevemes = "Junho"
        Elseif mes = 07 Then escrevemes = "Julho"
        Elseif mes = 08 Then escrevemes = "Agosto"
        Elseif mes = 09 Then escrevemes = "Setembro"
        Elseif mes = 10 Then escrevemes = "Outubro"
        Elseif mes = 11 Then escrevemes = "Novembro"
        Elseif mes = 12 Then escrevemes = "Dezembro"
    End If
End Function

Dim menor, maior, pegamenor, pegamaior, anos

menor = "05/04/2005" : maior = day(date) &"/"& month(date) &"/"& year(date)
pegamenor = Year(menor) : pegamaior = Year(maior)
anos = pegamaior - pegamenor

Response.Write "Arquivos<br /><br />"

Dim anodata, anocriado, mesdata, mescriado, conn, rc, anocomparado

For anodata = 1 to anos
    anocriado = pegamenor + anodata
    For mesdata = 1 to 12
        mescriado = mesdata
        Set Conn = CreateObject("ADODB.Connection")
        Conn.Open "DBQ=C:\Inetpub\playmix\lacamentos.mdb;Driver={Microsoft Access Driver (*.mdb)}"	
        Set RC = Conn.Execute("SELECT Count(Id) FROM lancamentos WHERE MONTH(datacadastro) = " & mescriado & " and YEAR(datacadastro) = " & anocriado & "")
        If RC(0) >= 1 Then
             If anocriado = anocomparado Then
		     Response.Write escrevemes(mescriado) & " (" & RC(0)  & ")<br />"
              Else
		     Response.Write anocriado & "<br />" & escrevemes(mescriado) & " (" & RC(0)  & ")<br />"
		     anocomparado = anocriado
              End If
        End If
        Conn.close
        Set Conn = Nothing
        Set RC = Nothing
    Next
Next
%>

E como diz o mano DarkDemo (carrasco do fórum), não se fazem mais programadores como antes kkkkkkk

Compartilhar este post


Link para o post
Compartilhar em outros sites

você poderia fazer uma SubSelect no SQL (um select dentro de outro)

 

mais ou menos assim (adapte a sua tabela)

 

"SELECT *, Count(Id) as totalAno,

(SELECT COUNT(post) as totalmes FROM conteudo WHEre Ativo = 'ativo')as totalmes

FROM conteudo WHERE Ativo = 'ativo' GROUP BY Year(Data) ORDER BY Id DESC"

 

Seria uma alternativa tbm, eu tinha pensado nisso para fazer a contagem dos mêses e posts, mas ocorre que ele não está agrupando pelo ano de jeito nenhum, porque será? se eu mando agrupar por categoria funciona a contagem, mas por ano ele conta tudo como 2009, pensei que pudesse ser o formato do campo que é texto, então modifiquei assim:

 

GROUP BY Year(CDate(Data))

mas ocorre erro de sintaxe.

a categoria também está no campo texto.

 

fico imaginando se o fato do nome do campo ser "Data" influencia em algo.

 

 

No meu caso eu fiz um esquema POG

 

<%
option explicit

Function escrevemes(mes)
    If mes = 01 Then
        escrevemes = "Janeiro"
        Elseif mes = 02 Then escrevemes = "Fevereiro"
        Elseif mes = 03 Then escrevemes = "Março"
        Elseif mes = 04 Then escrevemes = "Abril"
        Elseif mes = 05 Then escrevemes = "Maio"
        Elseif mes = 06 Then escrevemes = "Junho"
        Elseif mes = 07 Then escrevemes = "Julho"
        Elseif mes = 08 Then escrevemes = "Agosto"
        Elseif mes = 09 Then escrevemes = "Setembro"
        Elseif mes = 10 Then escrevemes = "Outubro"
        Elseif mes = 11 Then escrevemes = "Novembro"
        Elseif mes = 12 Then escrevemes = "Dezembro"
    End If
End Function

Dim menor, maior, pegamenor, pegamaior, anos

menor = "05/04/2005" : maior = day(date) &"/"& month(date) &"/"& year(date)
pegamenor = Year(menor) : pegamaior = Year(maior)
anos = pegamaior - pegamenor

Response.Write "Arquivos<br /><br />"

Dim anodata, anocriado, mesdata, mescriado, conn, rc, anocomparado

For anodata = 1 to anos
    anocriado = pegamenor + anodata
    For mesdata = 1 to 12
        mescriado = mesdata
        Set Conn = CreateObject("ADODB.Connection")
        Conn.Open "DBQ=C:\Inetpub\playmix\lacamentos.mdb;Driver={Microsoft Access Driver (*.mdb)}"	
        Set RC = Conn.Execute("SELECT Count(Id) FROM lancamentos WHERE MONTH(datacadastro) = " & mescriado & " and YEAR(datacadastro) = " & anocriado & "")
        If RC(0) >= 1 Then
             If anocriado = anocomparado Then
		     Response.Write escrevemes(mescriado) & " (" & RC(0)  & ")<br />"
              Else
		     Response.Write anocriado & "<br />" & escrevemes(mescriado) & " (" & RC(0)  & ")<br />"
		     anocomparado = anocriado
              End If
        End If
        Conn.close
        Set Conn = Nothing
        Set RC = Nothing
    Next
Next
%>

E como diz o mano DarkDemo (carrasco do fórum), não se fazem mais programadores como antes kkkkkkk

 

legal o função amigo, mas a minha intenção é fazer a SQL organizar os resultados, e procurar não definir os padrões de pesquisa, gosto de funcionalidade aliada a praticidade

ex: ai no seu escrevemes(mes), ao invés dessa função você pode usar:

 

'define padrão de data para Brasil
Session.LCID = 1046

Response.write MonthName(mescriado)

economiza um tempo de escrita e o torna mais pratico. Eu até que poderia criar uma rotina parecida com a sua, mas eu sei que tem como fazer com a SQL, então eu tento, agora quando empaca ai o trem vira um desafio pra mim kkkkkk.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posso está errado, mas tenho 99% de certeza que você não vai conseguir fazer isso somente através de uma consulta.

 

Segue abaixo a consulta para retornar o que precisa. Mas no momento em que ler as informações, você vai ter que tomar cuidado para não repetir o ano.

 

SELECT year(data) As Ano, month(data) As mes, Count(id) As Total FROM conteudo WHERE Ativo = 'ativo' GROUP BY month(data), year(data)

Não precisa colocar * no SELECT, pois o que importa é só a data e o total de posts.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilizando a SQL como o hargon disse:

SELECT YEAR(Data) as Ano,MONTH(Data) as Mes,COUNT(id) as TOTAL FROM materias GROUP BY Year(data),Month(Data)

Ele retorna os resultados que você quer, ai basta fazer o tratamento dentro do Loop...

 

Veja a imagem de como foram retornados os dados no MySql:

Imagem Postada

 

 

Agora é só tratar esses resultados no LOOP e jah era..

 

Att;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui fazer aqui em asp, segui tb a SQL postada pelo hargon, pra quem quiser e servir ta ai, estarei postando tb no lab de scripts, para que possa ajudar outros que tenham a mesma dúvida.

 

<%
Session.LCID = 1046

Set Conn = CreateObject("ADODB.Connection")
Conn.Open "DBQ=C:\Inetpub\patrique\server2\lancamento.mdb;Driver={Microsoft Access Driver (*.mdb)}"
Set RS = conn.Execute("SELECT YEAR(Data) as Ano, MONTH(Data) as Mes, COUNT(id) as TOTAL FROM materias GROUP BY Year(data),Month(Data)")

Do Until RS.EOF

    ano = RS("Ano")
    mes = RS("Mes")
    total = RS("Total")

    If ano = comparado Then
        Response.Write MonthName(mes) & "("&  total &")<br />"
    Else
        Response.Write "Arquivo " & ano & "<br />"
        Response.Write MonthName(mes) & "("&  total &")<br />"
        comparado = ano
    End If

RS.MoveNext : Loop

Set Conn = Nothing
RS.Close
Set RS = Nothing
%>

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

perfeito...

só agregadar o resultado conjunto de uma ou mais colunas na SQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendo porque aqui não funciona, os campos definidos "as mes" e "as ano" ficam NULL, por isso que ele não agrupa o resultado, porque é NULL, sendo que na verdade não é, e ele é texto e possui a data como segue as imagens abaixo:

 

Aqui eu tirei o Year(Data) na coluna Ano e deixei apenas Data para verem como ele possui valor, e ao mesmo tempo anula a coluna seguinte que utiliza o mesmo campo, no caso o Mes.

------

Imagem Postada

------

 

 

e aqui agrupei por categoria pra mostrar mais resultados:

 

------

Imagem Postada

------

 

o que será que está acontecendo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual o tipo de dados do seu campo DATA? Talvez o problema esteja aí.

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.