primeiro obrigado pela ajuda…
eu entendo que usando o left join eu teria que reavaliar as condições do where, mas o problema não é exatamente esse… o problema é que mesmo eu usando o left join da maneira certa, os dados que eu precise que venham nao ‘existem’… pois eu preciso ter todos os meses de um período X como resultado, mesmo se não existam auditorias (neste caso, o group by vai agrupar os meses, mas não vai ‘criar’ meses onde não tem auditorias)…
pra isso, criei uma tabela dinâmica de meses, que quando uma meta de auditoria é gravada, uma trigger é disparada executando uma função que percorre esse intervalo de valores e acrescenta os meses deste período… e então depois a consulta se baseia nesta tabela (que chamei de competencia)
segue a função:
CREATE OR REPLACE FUNCTION competencias_por_meta()
RETURNS trigger AS
$BODY$
declare
data date;
rec record;
begin
data := new.data_inicio;
while (data < new.data_fim) loop
select * into rec from competencias where first_day = data;
if not found then
insert into competencias values (date_part('year', data), date_part('month', data), data, last_day(data));
end if;
data := data + interval '1 month';
end loop;
return null;
end
$BODY$
LANGUAGE plpgsql VOLATILE
e então fiz a sql desta forma (ela ficou grande pelo fato de eu ter que fazer os subselects 2 vezes pois o resultado de um participa do cálculo para a porcenagem junto com o resultado do outro, já que não tem como usar um alias em um SELECT):
[code]select s.idsetores, s.nome,
(select count(idauditorias) from competencias cp left join auditorias on
data between cp.first_day and cp.last_day and setores_idsetores = s.idsetores) as total_auditorias,
(select sum (meta_auditorias) from
(select m.meta_auditorias from competencias cp left join metas_auditorias m on
cp.first_day between m.data_inicio and m.data_fim where m.idsetores = s.idsetores and cp.first_day between ? and ?) as soma_metas)
as soma_metas,
((select count(idauditorias) from competencias cp left join auditorias on
data between cp.first_day and cp.last_day and setores_idsetores = s.idsetores)::double precision * 100 /
(select sum (meta_auditorias) from (select m.meta_auditorias from competencias cp left join metas_auditorias m on
cp.first_day between m.data_inicio and m.data_fim where m.idsetores = s.idsetores and cp.first_day between ? and ?)
as soma_metas)::double precision) as percentual_alcancado from
setores s where s.empresas_idempresas = ? group by s.idsetores, s.nome limit nullif(?, 0)[/code]
assim, o ‘núcleo’ da consulta é a tabela de competências, e não mais a de auditorias…