Query de sum por mês entre duas datas
Olá pessoal, sou novo aqui. Gostaria de saber se alguém poderia me ajudar em um problema, se possível.
Preciso fazer uma query que retornasse uma coluna de meses, sendo que passo como parâmetro duas datas.
Tenho uma tabela de processos. Essa tabela me dá um total específico, somando todos os processos possíveis
entre essas duas datas. Daí preciso desmembrar esses processos, em cada mês, quantos foram abertos em
cada mês.
Exemplo:
BETWEEN TO_DATE('10/mm/2013','dd/mm/yyyy') AND TO_DATE('11/09/2013','dd/mm/yyyy')
Entre Maio e Setembro foram abertos 44 processos.
Daí queria que retornasse uma Query com os processos desmembrados por mês.
Maio | Junho | Julho | Agosto | Setembro
7 - 5 - 8 - 15 - 9
Não sei o quanto pode ser complexo, mas um início já me ajudaria bastante.
Desde já Obrigado.
Preciso fazer uma query que retornasse uma coluna de meses, sendo que passo como parâmetro duas datas.
Tenho uma tabela de processos. Essa tabela me dá um total específico, somando todos os processos possíveis
entre essas duas datas. Daí preciso desmembrar esses processos, em cada mês, quantos foram abertos em
cada mês.
Exemplo:
BETWEEN TO_DATE('10/mm/2013','dd/mm/yyyy') AND TO_DATE('11/09/2013','dd/mm/yyyy')
Entre Maio e Setembro foram abertos 44 processos.
Daí queria que retornasse uma Query com os processos desmembrados por mês.
Maio | Junho | Julho | Agosto | Setembro
7 - 5 - 8 - 15 - 9
Não sei o quanto pode ser complexo, mas um início já me ajudaria bastante.
Desde já Obrigado.
Dharion Soares
Curtidas 0
Melhor post
Fabiano Carvalho
12/06/2014
select mes,sum(valor) from table where mes between data1 and data2 group by mes
GOSTEI 1
Mais Respostas
Dharion Soares
12/06/2014
Especificando melhor. Entre duas Datas: BETWEEN TO_DATE('10/01/2014','dd/mm/yyyy') AND TO_DATE('11/09/2014,'dd/mm/yyyy')
O resultado do select seria assim:
Nome Processo | Jan | Fev | Mar | Abr
Processo 01 | 10 | 7 | 4 | 2 (Sum do processo 01 desmembrado do mês 01 ao 04)
------------------------------------------------------------
Processo 02 | 15 | 3 | 2 | 7 (Sum do processo 02 desmembrado do mês 01 ao 04)
O resultado do select seria assim:
Nome Processo | Jan | Fev | Mar | Abr
Processo 01 | 10 | 7 | 4 | 2 (Sum do processo 01 desmembrado do mês 01 ao 04)
------------------------------------------------------------
Processo 02 | 15 | 3 | 2 | 7 (Sum do processo 02 desmembrado do mês 01 ao 04)
GOSTEI 0
Alex Lekao
12/06/2014
Ola Bom dia!!!
Nao sei no Oracle como poderia ser feito exatamente.
Mas para os meses ficarem como colunas, vc teria que basicamente usar o que o Fabiano usou como exemplo e fazer um PIVOT convertendo as linhas em colunas, assim o "layout" ficaria parecido com o que vc mencionou.
Caso nao seja um problema, o exemplo citado pelo Fabiano, ficaria os meses em linhas e o valore de cada mes na coluna, para um periodo de 6 meses teria 6 linhas e uma coluna.
Uma outra possibilidade, talves nao muito performatica, seria utilizar subquerys para montar os meses por colunas, mas ficaria dinamico o processo.
Para ser dinamico somente com o PIVOT mesmo, mas nao sei se tem esse recurso no oracle e nem como fazer um similar.
Desculpe por nao poder ajudar.
Abraco.
Alex - Lekao
Nao sei no Oracle como poderia ser feito exatamente.
Mas para os meses ficarem como colunas, vc teria que basicamente usar o que o Fabiano usou como exemplo e fazer um PIVOT convertendo as linhas em colunas, assim o "layout" ficaria parecido com o que vc mencionou.
Caso nao seja um problema, o exemplo citado pelo Fabiano, ficaria os meses em linhas e o valore de cada mes na coluna, para um periodo de 6 meses teria 6 linhas e uma coluna.
Uma outra possibilidade, talves nao muito performatica, seria utilizar subquerys para montar os meses por colunas, mas ficaria dinamico o processo.
Para ser dinamico somente com o PIVOT mesmo, mas nao sei se tem esse recurso no oracle e nem como fazer um similar.
Desculpe por nao poder ajudar.
Abraco.
Alex - Lekao
GOSTEI 1
Dharion Soares
12/06/2014
Obrigado pela ajuda Fabiano. Tentei assim mas o resultado sai na vertical, mas preciso do resultado por processo e os meses lado a lado.
GOSTEI 0
Dharion Soares
12/06/2014
Obrigado também Alex. Vou dar uma pesquisada melhor nisso.
GOSTEI 0
Alex Lekao
12/06/2014
Blz.
Precisando eh so falar.
Abraco!!!
Alex - Lekao
Precisando eh so falar.
Abraco!!!
Alex - Lekao
GOSTEI 0
Fabiano Carvalho
12/06/2014
Obrigado pela ajuda Fabiano. Tentei assim mas o resultado sai na vertical, mas preciso do resultado por processo e os meses lado a lado.
Bom dia.
Em sql server poderia lhe auxiliar, não conheço muito sobre oracle, tente ver isso
http://www.oracle.com/technetwork/pt/articles/sql/principais-caracteristicas-database-2108383-ptb.html
Ou caso queira procurar, pesquise por pivot e unpivot
GOSTEI 0
Fabiano Carvalho
12/06/2014
Mais ou menos isso.
select * from ( select Mes,Hora from Tabela WHERE DATA BETWEEN DATA1 AND DATA2 ) source pivot (SUM(VALOR) for MES in ( [JANEIRO],[FEVEREIRO] )) [pivote] ORDER BY 1
GOSTEI 0
Dharion Soares
12/06/2014
Obrigado Fabiano. Vou analisar essa opção. Valeu mesmo.
GOSTEI 0
Alex Lekao
12/06/2014
Dharion,
O Fabiano eh fera!!!!
Pode ir nas dicas dele tranquilo que ele manda muito bem!!!
Abraco.
Alex - Lekao
O Fabiano eh fera!!!!
Pode ir nas dicas dele tranquilo que ele manda muito bem!!!
Abraco.
Alex - Lekao
Obrigado Fabiano. Vou analisar essa opção. Valeu mesmo.
GOSTEI 1
Dharion Soares
12/06/2014
Fabiano, estou com o código aqui do meu Select. Eu vou pegar os valores por linha mesmo. Mas não estou conseguindo unir os valores.
Segue o meu código:
São 4 Tabelas que levam a consulta. Está dando um erro assim no final: Não é uma função de grupo de grupo simples. Aí o erro aponta pra coluna "p.pro_data_abertura"
SELECT SUM (COUNT (ap.ass_descricao)), TO_CHAR(p.pro_data_abertura, 'mm/YYYY') FROM (
SELECT
SUM (COUNT (ap.ass_descricao)) AS qtd,
TO_CHAR(p.pro_data_abertura, 'mm/YYYY') AS dataAb
FROM
processos.pro_assuntos_processos ap,
processos.pro_assuntos_do_processo adp,
processos.pro_processos p,
processos.pro_tramitacoes t
WHERE
ap.ass_codigo = adp.asp_ass_codigo_assunto
AND adp.asp_pro_codigo_processo = p.pro_codigo
AND p.pro_codigo = t.tra_pro_codigo_processo
AND p.pro_data_abertura
BETWEEN TO_DATE('01/03/2014','dd/mm/yyyy') AND TO_DATE('11/05/2014','dd/mm/yyyy')
GROUP BY
TO_CHAR(p.pro_data_abertura, 'mm/YYYY')), processos.pro_assuntos_processos ap, processos.pro_processos p
Esse SUM (COUNT (ap.ass_descricao)) é pra fazer a contagem das descrições dos processos e comparar na tabela tramitações. É pra saber quantos processos
foram tramitados entre as datas. Depois faço um sum pra somar essa contagem. O problema é na hora de agregar,, que fica dando esse erro de função de grupo.
Se puder me ajudar em alguma solução agradeço.
Segue o meu código:
São 4 Tabelas que levam a consulta. Está dando um erro assim no final: Não é uma função de grupo de grupo simples. Aí o erro aponta pra coluna "p.pro_data_abertura"
SELECT SUM (COUNT (ap.ass_descricao)), TO_CHAR(p.pro_data_abertura, 'mm/YYYY') FROM (
SELECT
SUM (COUNT (ap.ass_descricao)) AS qtd,
TO_CHAR(p.pro_data_abertura, 'mm/YYYY') AS dataAb
FROM
processos.pro_assuntos_processos ap,
processos.pro_assuntos_do_processo adp,
processos.pro_processos p,
processos.pro_tramitacoes t
WHERE
ap.ass_codigo = adp.asp_ass_codigo_assunto
AND adp.asp_pro_codigo_processo = p.pro_codigo
AND p.pro_codigo = t.tra_pro_codigo_processo
AND p.pro_data_abertura
BETWEEN TO_DATE('01/03/2014','dd/mm/yyyy') AND TO_DATE('11/05/2014','dd/mm/yyyy')
GROUP BY
TO_CHAR(p.pro_data_abertura, 'mm/YYYY')), processos.pro_assuntos_processos ap, processos.pro_processos p
Esse SUM (COUNT (ap.ass_descricao)) é pra fazer a contagem das descrições dos processos e comparar na tabela tramitações. É pra saber quantos processos
foram tramitados entre as datas. Depois faço um sum pra somar essa contagem. O problema é na hora de agregar,, que fica dando esse erro de função de grupo.
Se puder me ajudar em alguma solução agradeço.
GOSTEI 0
Dharion Soares
12/06/2014
Aqui tem o esquema das tabelas
[img]http://arquivo.devmedia.com.br/forum/imagem/373929-20140613-110214.png[/img]
[img]http://arquivo.devmedia.com.br/forum/imagem/373929-20140613-110232.png[/img]
[img]http://arquivo.devmedia.com.br/forum/imagem/373929-20140613-110243.png[/img]
[img]http://arquivo.devmedia.com.br/forum/imagem/373929-20140613-110253.png[/img]
Desde já obrigado.
[img]http://arquivo.devmedia.com.br/forum/imagem/373929-20140613-110214.png[/img]
[img]http://arquivo.devmedia.com.br/forum/imagem/373929-20140613-110232.png[/img]
[img]http://arquivo.devmedia.com.br/forum/imagem/373929-20140613-110243.png[/img]
[img]http://arquivo.devmedia.com.br/forum/imagem/373929-20140613-110253.png[/img]
Desde já obrigado.
GOSTEI 0
Fabiano Carvalho
12/06/2014
tente verificar essa documentação.
http://www.oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1.php
Um dica: Crie uma tabela temporaria sem tentar realizar o pivote com a coluna data já formatada (no sql server ele não deixa usar funcao no FOR do pivot).
Resumindo: Crie uma tabela com a sua consulta e depois tente dar um pivote nessa table :)
http://www.oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1.php
Um dica: Crie uma tabela temporaria sem tentar realizar o pivote com a coluna data já formatada (no sql server ele não deixa usar funcao no FOR do pivot).
Resumindo: Crie uma tabela com a sua consulta e depois tente dar um pivote nessa table :)
GOSTEI 0
Fabiano Carvalho
12/06/2014
Não consigo te ajudar tanto, pois nunca trabalhei com oracle.
GOSTEI 0
Lourival Queiroz
12/06/2014
Exemplos de PIVOT
SELECT *
from (
SELECT to_char(created,'mm') mes ,
nvl(count(OBJECT_NAME),0) qtd
FROM USER_OBJECTS
where to_char(created,'yyyy') = '2013'
GROUP BY TO_CHAR(CREATED,'mm')
)
PIVOT (SUM(QTD) AS QTD
FOR (mes) IN ('01' AS JAN, '02' AS FEV, '03' AS MAR, '03' AS ABR,
'05' AS MAI, '06' AS JUN, '07' AS JUL, '08' AS AGO,
'09' AS STB, '10' AS OUT, '11' AS NOV, '12' AS DEZ))
SELECT *
from (
SELECT to_char(created,'mm') mes ,
count(OBJECT_NAME) qtd,
sum(namespace) valor
FROM USER_OBJECTS
where to_char(created,'yyyy') = '2013'
GROUP BY TO_CHAR(CREATED,'mm')
)
PIVOT (SUM(QTD) AS QTD,
SUM(valor) AS valor
FOR (mes) IN ('01' AS JAN, '02' AS FEV, '03' AS MAR, '03' AS ABR,
'05' AS MAI, '06' AS JUN, '07' AS JUL, '08' AS AGO,
'09' AS STB, '10' AS OUT, '11' AS NOV, '12' AS DEZ))
GOSTEI 0