Query de sum por mês entre duas datas

Oracle

12/06/2014

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.
Dharion Soares

Dharion Soares

Curtidas 0

Melhor post

Fabiano Carvalho

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

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)
GOSTEI 0
Alex Lekao

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
GOSTEI 1
Dharion Soares

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

Dharion Soares

12/06/2014

Obrigado também Alex. Vou dar uma pesquisada melhor nisso.
GOSTEI 0
Alex Lekao

Alex Lekao

12/06/2014

Blz.

Precisando eh so falar.

Abraco!!!

Alex - Lekao
GOSTEI 0
Fabiano Carvalho

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

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

Dharion Soares

12/06/2014

Obrigado Fabiano. Vou analisar essa opção. Valeu mesmo.
GOSTEI 0
Alex Lekao

Alex Lekao

12/06/2014

Dharion,

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

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.
GOSTEI 0
Dharion Soares

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.
GOSTEI 0
Fabiano Carvalho

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 :)
GOSTEI 0
Fabiano Carvalho

Fabiano Carvalho

12/06/2014

Não consigo te ajudar tanto, pois nunca trabalhei com oracle.
GOSTEI 0
Lourival Queiroz

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
POSTAR