Obrigado pela dica Osvaldo.
Na verdade a 1ª query é apenas para montar o cabeçalho do relatório e
organizar as informações capturada na 2ª query
select distinct unidade, estado, extract(year from data) as ano,
extract(month from data) as mes, sum(vendas) as atendimentos from( ...) as
registro
where extract(year from dat_emissao) || extract(month from dat_emissao)
between $P{ano_ini} || $P{mes_ini} and $P{ano_fim} || $P{mes_fim}
group by extract(year from data), extract(month from data), unidade, estado
order by extract(year from data), extract(month from data)
A 2ª query é para levantar as informações para montar o relatório
propriamente dido
select distinct nom_filial as unidade, est_filial as estado, (dat_emissao)
as data, count(dat_emissao) as vendas
from cadcvend, cadfilia
where cadfilia.cod_filial = cadcvend.cod_filial
and flg_excluido is null
and num_nf is null
and extract(year from dat_emissao) || extract(month from dat_emissao)
between $P{ano_ini} || $P{mes_ini} and $P{ano_fim} || $P{mes_fim}
group by dat_emissao, nom_filial, est_filial order by dat_emissao
A sugestão do Matheus caiu como uma luva. Achei a sua um pouco mais
complicada, mas vou testá-la também.
Em 30 de outubro de 2013 12:37, Osvaldo Kussama
<[email protected]>escreveu:
> Em 30/10/13, Ramiro Pamponet<[email protected]> escreveu:
> > Bom dia Pessoal,
> >
> > utilizo a seguinte query abaixo para montar um relatório no iReport para
> > meu programa ...
> >
> -------------------------------------------------------------------------------------------------------------
> > select distinct unidade, estado, extract(year from data) as ano,
> > extract(month from data) as mes, sum(vendas) as atendimentos from(
> > select distinct nom_filial as unidade, est_filial as estado,
> (dat_emissao)
> > as data, count(dat_emissao) as vendas
> > from cadcvend, cadfilia
> > where cadfilia.cod_filial = cadcvend.cod_filial
> > and flg_excluido is null
> > and num_nf is null
> > and extract(year from dat_emissao) between $P{ano_ini} and $P{ano_fim}
> > and extract(month from dat_emissao) between $P{mes_ini} and $P{mes_fim}
> > group by dat_emissao, nom_filial, est_filial order by dat_emissao) as
> > registro
> > where extract(year from data) between $P{ano_ini} and $P{ano_fim}
> > and extract(month from data) between $P{mes_ini} and $P{mes_fim}
> > group by extract(year from data), extract(month from data), unidade,
> estado
> > order by extract(year from data), extract(month from data)
> >
> -------------------------------------------------------------------------------------------------------------
> > ... onde os parâmetros $P{ano_ini}, $P{ano_fim}, $P{mes_ini} e
> $P{mes_fim}
> > são passados pelo programa com DOUBLE e na configuração dos parâmetros no
> > relatório eu os declaro assim - new Double(valor).
> >
> > O relatório funciona perfeitamente, se for considerado um período entre
> os
> > meses de 1 a 12 dentro do mesmo ano ou se for considerado todos os meses
> de
> > vários anos, mesmo o ano não tendo acabado ainda.
> >
> > Para minha surpresa, estava realizando alguns teste no programa e
> percebi o
> > seguinte bug: considerando o mês inicial = 1, o ano inicial = 2005, o mês
> > final = 5 e o ano final = 2006 (por exemplo), o relatório rea montado da
> > seguinte forma ...
> >
> > Ano Mês Atendimentos
> > 2005 1 xxx
> > 2005 2 xxx
> > 2005 3 xxx
> > 2005 4 xxx
> > 2005 5 xxx
> > 2006 1 xxx
> > 2006 2 xxx
> > 2006 3 xxx
> > 2006 4 xxx
> > 2006 5 xxx
> >
> > ... pulando os meses 6 a 12 do ano de 2005 (por exemplo).
> >
> > Em um fórum do GUJ fui orientado a modificar minha query da seguinte
> forma
> > ...
> >
> -------------------------------------------------------------------------------------------------------------
> > select distinct unidade, estado, extract(year from data) as ano,
> > extract(month from data) as mes, sum(vendas) as atendimentos from(
> > select distinct nom_filial as unidade, est_filial as estado,
> (dat_emissao)
> > as data, count(dat_emissao) as vendas
> > from cadcvend, cadfilia
> > where cadfilia.cod_filial = cadcvend.cod_filial
> > and flg_excluido is null
> > and num_nf is null
> > and extract(year from dat_emissao) || extract(month from dat_emissao)
> > between $P{ano_ini} || $P{mes_ini} and $P{ano_fim} || $P{mes_fim}
> > group by dat_emissao, nom_filial, est_filial order by dat_emissao) as
> > registro
> > where extract(year from dat_emissao) || extract(month from dat_emissao)
> > between $P{ano_ini} || $P{mes_ini} and $P{ano_fim} || $P{mes_fim}
> > group by extract(year from data), extract(month from data), unidade,
> estado
> > order by extract(year from data), extract(month from data)
> >
> -------------------------------------------------------------------------------------------------------------
> > ... que resolveu meu problema em parte, pois dessa forma pega todos os
> > meses do intervalo de ano selecionado, mas no último ano, se ainda não
> > tiver sido concluído (exemplo 2013) ele pega apenas o 1º e o último mês
> do
> > intervalo, pulando todos os outros meses do ano, mas se considerar
> apenas o
> > ano de 2013 e os meses de 1 a 10, o relatório sai correto, ou se
> considerar
> > apenas anos que já foram concluídos, ou então, sempre considerar o mês
> > inicial = 1 e o mês final = 12.
> >
> > Existe alguma forma de juntar o que está dando certo no 1º relatório com
> o
> > que está dando certo no 2º relatório?
> >
> > As sugestões serão bem vidas!
> >
> > Obrigado aos que puderem me dar essa ajuda
> >
>
>
> Sua query original faz exatamente o que você definiu. Na realidade ela
> contém um erro de lógica.
>
> Sua segunda query está incompleta. Falta um fecha parênteses em algum
> lugar.
>
> Como sugestão troque:
> extract(year from dat_emissao) || extract(month from dat_emissao)
> between $P{ano_ini} || $P{mes_ini} and $P{ano_fim} || $P{mes_fim}
> e similares, por:
> date_trunc('month', dat_emissao) BETWEEN to_date('01'|| $P{mes_ini} ||
> $P{ano_ini}, 'DDMMYYYY') AND to_date('01'|| $P{mes_fim} ||
> $P{ano_fim}, 'DDMMYYYY')
>
> Osvaldo
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral