Fórum Query de sum por mês entre duas datas #482330
12/06/2014
0
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
Curtir tópico
+ 0Post mais votado
12/06/2014
select mes,sum(valor) from table where mes between data1 and data2 group by mes
Fabiano Carvalho
Gostei + 1
Mais Posts
12/06/2014
Dharion Soares
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
12/06/2014
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
12/06/2014
Dharion Soares
Gostei + 0
12/06/2014
Dharion Soares
Gostei + 0
12/06/2014
Alex Lekao
Precisando eh so falar.
Abraco!!!
Alex - Lekao
Gostei + 0
12/06/2014
Fabiano Carvalho
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
12/06/2014
Fabiano Carvalho
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
12/06/2014
Dharion Soares
Gostei + 0
12/06/2014
Alex Lekao
O Fabiano eh fera!!!!
Pode ir nas dicas dele tranquilo que ele manda muito bem!!!
Abraco.
Alex - Lekao
Gostei + 1
13/06/2014
Dharion Soares
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
13/06/2014
Dharion Soares
[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
13/06/2014
Fabiano Carvalho
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
13/06/2014
Fabiano Carvalho
Gostei + 0
27/06/2014
Lourival Queiroz
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
Clique aqui para fazer login e interagir na Comunidade :)