Aqui el código desde delphi que utilizo para construir el SELECT
Código Delphi
[-]procedure TfrmOpDespacho.GroupBox4Exit(Sender: TObject);
var
clave,i, i_difer :integer;
wMes,wDia,wAnio:Word;
cMes:String;
Porcentaje:Real;
begin
qryPlanta.Close;
qryPlanta.Open;
qryPlanta.FetchAll;
qryPlanta.First;
qryMesEmbarque.Close;
qryMesEmbarque.Open;
case cbxMes.ItemIndex+1 of
1 :cMes:='a.Ene';
2 :cMes:='a.Feb';
3 :cMes:='a.Mar';
4 :cMes:='a.Abr';
5 :cMes:='a.Myo';
6 :cMes:='a.Jun';
7 :cMes:='a.Jul';
8 :cMes:='a.Ago';
9 :cMes:='a.Sep';
10:cMes:='a.Oct';
11:cMes:='a.Nov';
12:cMes:='a.Dic';
end;
if not(cMes=' ') then
begin
IBQry.Close;
IBQry.SQL.Clear;
IBQry.SQL.Add('select a.anio,');
IBQry.SQL.Add(' '+cMes+' as lts_prog_anual,');
IBQry.SQL.Add(' (select sum(b.litros)');
IBQry.SQL.Add(' from reporte_despacho1 b');
IBQry.SQL.Add(' where extract(year from b.fecha_embarque)=:anio');
IBQry.SQL.Add(' and extract(month from b.fecha_embarque)=:mes');
IBQry.SQL.Add(' and b.producto like '''+'AS%'+''') as lts_despacho,');
IBQry.SQL.Add(' ((select sum(c.litros)');
IBQry.SQL.Add(' from reporte_despacho1 c');
IBQry.SQL.Add(' where extract(year from c.fecha_embarque)=:anio');
IBQry.SQL.Add(' and extract(month from c.fecha_embarque)=:mes');
IBQry.SQL.Add(' and c.producto like '''+'AS%'+''' )-'+cMes+') as difer,');
IBQry.SQL.Add(' ((select sum(d.litros)');
IBQry.SQL.Add(' from reporte_despacho1 d');
IBQry.SQL.Add(' where extract(year from d.fecha_embarque)=:anio');
IBQry.SQL.Add(' and extract(month from d.fecha_embarque)=:mes');
IBQry.SQL.Add(' and d.producto like '''+'AS%'+''' )/'+cMes+')*100 as porcentaje');
IBQry.SQL.Add('from PROGRAMA_DISTRIBUCION_ANUAL A');
IBQry.SQL.Add('where a.clave_clasificacion=3');
IBQry.SQL.Add(' and a.clave_rubro=1');
IBQry.SQL.Add(' and a.anio=:anio');
IBQry.ParamByName('MES').AsInteger:=cbxMes.ItemIndex+1;
IBQry.ParamByName('anio').AsString:=mskAnio.Text;
IBQry.Open;
qryProgAnual.Close;
qryProgAnual.ParamByName('anio').AsString:=mskAnio.Text;
qryProgAnual.Open;
qryLtsDespacho.Close;
qryLtsDespacho.ParamByName('anio').AsString:=mskAnio.Text;
qryLtsDespacho.ParamByName('mes').AsInteger:=cbxMes.ItemIndex+1;
qryLtsDespacho.Open;
i_difer:=qryLtsDespacho.fieldByName('lts_despacho').AsInteger-qryProgAnual.fieldBYName('lts_prog_anual').AsInteger;
mskDifer.Text:=IntToStr(i_difer);
if i_difer<0 then
begin
Label3.Caption:='ABAJO CON:';
img1.Picture:=imgAbajo.Picture;
end Else
begin
Label3.Caption:='ARRIBA CON:';
img1.Picture:=imgArriba.Picture;
end;
Porcentaje:=(qryLtsDespacho.fieldByName('lts_despacho').AsFloat/
qryProgAnual.fieldByName('lts_prog_anual').AsFloat)*100.00;
mskPorcentaje.Text:=Format('%n',[Porcentaje]);
DecodeDate(Date,wAnio,wMes,wDia);
end Else
begin
end;
end;