Ir para conteúdo

Arquivado

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

diegohamaz

Query com contador a partir de um mes

Recommended Posts

Bom Dia pessoal, alguem pode me ajudar a resovler essa query, é o seguinte preciso trazer uma coluna com mes e ano e outra com um count de algumas coisas no banco o relatorio final ficaria mais ou menos assim

 

COLUNA1 COLUNA2 COLUNA3

JANEIRO/2015 COUNT() de usuario de JAN COUNT de usuario de JAN FEVEREIRO/2015 COUNT() de usuario de FEV COUNT de usuario de FEV

MARÇO/2015 COUNT() de usuario de MAR COUNT de usuario de MAR

 

 

 

Até o mês corrente sem colocar um between de data, por exemplo se virar o mês pra novembro ele já me traz novembro, fiz a query abaixo porem tem que colcoar um between

Select to_char(add_months(trunc( TO_DATE('01/2015','MM/YYYY') ,'mm'),rownum-1),'Month') mês, to_char(add_months(trunc( TO_DATE('01/2015','MM/YYYY') ,'mm'),rownum-1),'yyyy') ano from user_tables where rownum <= months_between ( to_date('12/2015','mm/yyyy'), to_date('01/2015','mm/yyyy')) + 1 ; 

gostaria que me retornasse automatico e na contagem já passasse a data do mes como por exemplo count(usuario) from blabla where data = 'DATA COLUNA'

Compartilhar este post


Link para o post
Compartilhar em outros sites

vc quer algo algo assim, creio

select to_char(data_venda,'mm') mes,
       sum(case when mod_pgto = 'cartao' then valor else 0 end) cartao,
       sum(case when mod_pgto = 'dinheiro' then valor else 0 end) dinheiro
from vendas
group by to_char(data_venda,'mm')

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao Motta seguinte,

 

 

A consulta tem que trazer uma relatorio com a primeira coluna com mes e ano extenso , primeira coisa então

 

JANEIRO-2015

FEVEREIRO-2015

etc

 

Isso ja consegui na query abaixo ..

 

SELECT TO_CHAR(add_months(TRUNC( TO_DATE('01/2015','MM/YYYY') ,'mm'),rownum-1),'Month') mês,
    TO_CHAR(add_months(TRUNC( TO_DATE('01/2015','MM/YYYY') ,'mm'),rownum     -1),'yyyy') ano
FROM user_tables
WHERE rownum <= months_between ( SYSDATE, to_date('01/2015','mm/yyyy')) + 1 ; 

Agora tenho uma coluna que esta formatada dessa forma e eu teria que adptar as subconsultas para pegar a data em questão da primeira query para trazer o count do mes em questão a query está abaixo.

select COUNT(*)
from tabela."sel_eco"
inner join tabela.tblecotrb tr  on tr.insmun = "eco_inscricao"
inner join cliente1.credenciamento cr
  on cr.insmun= tr.insmun
where trim("eco_situacaoEmpresa") in (
 SELECT trim(regexp_replace(ativo, '['']', '')) AS semaspas from (
      select regexp_substr((select "cfg_sitativas" from tabela."config" where "cfg_codcid"='7145'),'[^,]+', 1, level) as ativo from dual connect by regexp_substr((select "cfg_sitativas" from tabela."config" where "cfg_codcid"='7145'), '[^,]+', 1, level) is not null
    )
)
and "eco_unid_produtiva" = 'S'
and cr.DATA_FIM is null and cr.autorizado='S'
and cr.codcid='7145'
and tr.tipoenq = '3'
and "cfg_codcid"= cr.codcid;

Compartilhar este post


Link para o post
Compartilhar em outros sites

MOTTA É ISSO AQUI


POREM NA SUBQUERY NAO ESTOU CONSEGUINDO PEGAR DO MES EM QUESTÃO A SUBQUERY NAO ENTENDE O FORMATO , A data_formatada_1 JÁ ESTA FORMATADA DA MENIERA QUE A COLUNA ESPERA.

Compartilhar este post


Link para o post
Compartilhar em outros sites

OUTRA COISA ESSA COLUNA MESREFINI É DATE

 

 

COLOQUEI ASSIM AND tr.MESREFINI >= TO_DATE('01/07/15','DD/MM/YY') E NAO FUNCIONOU NAO ME RETORNA OS REGISTROS

 

E NEM ASSIM

 

AND tr.MESREFINI >= '01/07/15'

Compartilhar este post


Link para o post
Compartilhar em outros sites

O tipo é date

 

 

estou tentando essa query



O resultado é esse abixo, porém eu tenho um registro em março acho que naquela subquery o intervalo nao esta funcionando , estou tentando fazer automatico esse count pegando os meses já

 

Janeiro 2015 0
Fevereiro2015 0
Março 2015 0
Abril 2015 0
Maio 2015 0
Junho 2015 0
Julho 2015 0
Agosto 2015 0
Setembro 2015 0
Outubro 2015 0
Registro que contem a data
MESREFINI
000000000 31/12/69 01/03/15 0 7145
essa concatenação me retona as data que quero certinho
01'||'/'||TO_CHAR(add_months(TRUNC( TO_DATE('01/2015','MM/YYYY'),'mm'),rownum-1),'MM')||'/'||TO_CHAR(add_months(TRUNC(TO_DATE('01/2015','MM/YYYY') ,'mm'),rownum-1),'YY')
mas na subquery nao funciona
AND tr.MESREFINI >= TO_DATE('01'||'/'||TO_CHAR(add_months(TRUNC( TO_DATE('01/2015','MM/YYYY'),'mm'),rownum-1),'MM')||'/'||TO_CHAR(add_months(TRUNC(TO_DATE('01/2015','MM/YYYY') ,'mm'),rownum-1),'YY'),'dd/mm/yy')
AND tr.MESREFINI <= TO_DATE('31'||'/'||TO_CHAR(add_months(TRUNC( TO_DATE('01/2015','MM/YYYY'),'mm'),rownum-1),'MM')||'/'||TO_CHAR(add_months(TRUNC(TO_DATE('01/2015','MM/YYYY') ,'mm'),rownum-1),'YY'),'dd/mm/yy') 

Compartilhar este post


Link para o post
Compartilhar em outros sites
DO JEITO ABAIXO ME RETORNA TENTEI COLOCAR ASPAS SIMPLES E NAO RETORNA TAMBEM , TENTEI UM TRUNC 'MM' E TAMBEM NAO VAI




AND tr.MESREFINI >= TO_DATE('01/03/15','dd/mm/yy')
AND tr.MESREFINI <= TO_DATE('31/03/15','dd/mm/yy')

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vc tem datas que atendam a regra ?

 

A síntaxe me oarece certa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenho sim MOTTA , o AND que nao funciona é esse

AND tr.MESREFINI >= TO_DATE('01'||'/'||TO_CHAR(add_months(TRUNC( TO_DATE('01/2015','MM/YYYY'),'mm'),rownum-1),'MM')||'/'||TO_CHAR(add_months(TRUNC(TO_DATE('01/2015','MM/YYYY') ,'mm'),rownum-1),'YY'),'dd/mm/yy')
AND tr.MESREFINI <= TO_DATE('31'||'/'||TO_CHAR(add_months(TRUNC( TO_DATE('01/2015','MM/YYYY'),'mm'),rownum-1),'MM')||'/'||TO_CHAR(add_months(TRUNC(TO_DATE('01/2015','MM/YYYY') ,'mm'),rownum-1),'YY'),'dd/mm/yy')

Esse funciona

AND tr.MESREFINI >= TO_DATE('01/03/15','dd/mm/yy')
AND tr.MESREFINI <= TO_DATE('31/03/15','dd/mm/yy')

Não sei se não funciona dentro da subquery ou por causa da concatenação tentei transformar em varios tipos e nao vai.

 

tentei agregar o where a subquery e tambem nao vai

FROM user_tables
WHERE rownum <= months_between ( SYSDATE, to_date('01/2015','mm/yyyy')) + 1 ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que eu percebi é que a subquery nao se ajusta ao rownum da query pai

 

FROM user_tables
WHERE rownum <= months_between ( SYSDATE, to_date('01/2015','mm/yyyy')) + 1
tem alguma forma de solucionar isso?:

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que pretende com

rownum <= months_between ( SYSDATE, to_date('01/2015','mm/yyyy')) + 1

?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele me gera uma lista de meses apartir de janeiro até o mes corrente

 

JANEIRO

FEVEREIRO

MARÇO

 

até novembro no caso ,se virar o mes ja entra em dezembro e a subquerys é pra dar um count de uma consulta que foi sugerido aqui, infelizmente tem que ser nesse padrão.

 

 

Ai queria jogar aquele intervalo no between de datas pra pegar a contagem daquelas datas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu não entendi a razão de se montar esta query de forma "virtual" , não daria para obter as datas da referencias das tabelas correntes ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema que ele vai trazer apenas quando existe registro quando uso um group by, no caso o relatorio mesmo se nao tiver nada tem que trazer a coluna do mes e ano mesmo estando zerada, eu consegui dessa forma...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendo , eu faço com union , exemplo simplificado

select data_venda , sum(total) total
from
(
select data_venda , sum(valor_venda) total
from vendas
where to_char(data_venda,'yyyymm') = '201511'

union all

select (to_date('201511','yyyymm'))+1 , 0
from vendas
where rownum < 31
) virtual
group by  data_venda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pq não ?

 

Já fiz diversos relatórios deste tipo (dados faltantes) com esta estratégia.

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.