GARANTIR DESCONTO

Fórum Ajuda com Query #392530

15/12/2010

0

Boa tarde, Srs!

Bom sou novo nesta comunidade, e novo com o Firebird, então venho através desta solicitar uma pequena ajuda de vocês em uma Query.

Tenho 2 Tabelas sendo:

TABELA 1 - BILHETACAO

ALTER TABLE BILHETACAO
  ADD BIL_ID INTEGER NOT NULL;
  DROP CONSTRAINT PK_BILHETACAO;
  ADD CONSTRAINT PK_BILHETACAO
  PRIMARY KEY (BIL_ID);
  ADD DTVENC_BI TIMESTAMP;
  ADD DDD VARCHAR(5);
  ADD NROTELEFO VARCHAR(10);
  ADD TPSERVICO VARCHAR(4);
  ADD DTLIGACAO TIMESTAMP;
  ADD DURAC_LIG FLOAT;
  ADD VAL_LIGAC DOUBLE PRECISION;

TABELA 2 - DESCONTOS

ALTER TABLE DESCONTOS
  ADD DES_ID INTEGER NOT NULL;
  DROP CONSTRAINT PK_DESCONTOS;
  PRIMARY KEY (DES_ID);
  ADD DTVENC_DE TIMESTAMP;
  ADD VAL_LIGAC FLOAT;
  ADD DDD VARCHAR(5);
  ADD NROTELEFO VARCHAR(10);

Obs: Copiei do Firebird, ai veio neste formato!

Enfim eu gostaria de unir 2 QUERYs em UMA, porém estou com grandes dificuldades. estas querys seriam:

SELECT bilhetacao.ddd, BILHETACAO.NROTELEFO,
sum(BILHETACAO.DURAC_LIG) MINUTOS, sum(BILHETACAO.VAL_LIGAC) VALOR
FROM BILHETACAO
where bilhetacao.DTVENC_BI = '27-sep-2010' group by bilhetacao.ddd, BILHETACAO.NROTELEFO;

Retorno:
DDD    NROTELEFO     MINUTOS                    VALOR
11000    20112056    1351,50000846386    48,7200000000009
11000    20114366    1409,20000356436    59,1500000000011
11000    20115195    428,600000798702    14,7899999999999
11000    20427658    3697,10001146793    154,340000000004

select descontos.DDD, descontos.NROTELEFO, sum(descontos.VAL_LIGAC) DESCONTO from descontos
where descontos.DTVENC_DE  = '27-oct-2010' group by descontos.ddd, descontos.NROTELEFO;

Retorno:
DDD    NROTELEFO    DESCONTO
11000    20312210    -2,30999994277954
11000    20352237    -2,30999994277954
11000    20427658    -2,30999994277954

Como vocês podem observar, uma Query é responsável por somar todos os minutos de um número e o valor total e outra Query é responsável por somar os descontos de um número... Mas eis o problema, não é todo número que consumiu minutos sendo assim não tendo um valor, porém este número pode conter um desconto, e nos casos normais um número tem minutos e um valor e possui um desconto (Ex: NROTELEFO  = 20427658 )

O resultado final desejado seria algo do tipo:

DDD       NROTELEFO     MINUTOS                     VALOR                            DESCONTO
11000    20112056       1351,50000846386    48,7200000000009        NULL
11000    20427658       3697,10001146793    154,340000000004        -2,30999994277954
11000    20312210       NULL                           NULL                               -2,30999994277954

Eu tentei da seguinte forma com uma cláusula no where b.NROTELEFO='20312210:

select b.DDD, b.NROTELEFO, sum(d.VAL_LIGAC) / (select count(*) AS SOMA
from BILHETACAO as b LEFT JOIN DESCONTOS as d
ON b.NROTELEFO = d.NROTELEFO
where b.DTVENC_BI = '27-sep-2010' AND b.NROTELEFO='20312210'
group by b.DDD, b.NROTELEFO, d.VAL_LIGAC ) as DESCONTO,
sum(b.DURAC_LIG) TOTAL_LIG, sum(b.VAL_LIGAC) TOTAL_VALOR, count(*) AS SOMA
from BILHETACAO as b LEFT JOIN DESCONTOS as d
ON b.NROTELEFO = d.NROTELEFO
where b.DTVENC_BI = '27-sep-2010' AND b.NROTELEFO='20312210'
group by b.DDD, b.NROTELEFO, d.VAL_LIGAC;

Porém quando tiro esta cláusula (para fazer para todos os números) do where a query não funciona e ainda  trava o Firebird!

select b.DDD, b.NROTELEFO, sum(d.VAL_LIGAC) / (select count(*) AS SOMA
from BILHETACAO as b LEFT JOIN DESCONTOS as d
ON b.NROTELEFO = d.NROTELEFO
where b.DTVENC_BI = '27-sep-2010'
group by b.DDD, b.NROTELEFO, d.VAL_LIGAC ) as DESCONTO,
sum(b.DURAC_LIG) TOTAL_LIG, sum(b.VAL_LIGAC) TOTAL_VALOR, count(*) AS SOMA
from BILHETACAO as b LEFT JOIN DESCONTOS as d
ON b.NROTELEFO = d.NROTELEFO
where b.DTVENC_BI = '27-sep-2010'
group by b.DDD, b.NROTELEFO, d.VAL_LIGAC;

Como posso fazer?


Diego Ramos

Diego Ramos

Responder

Posts

17/12/2010

Diego Ramos

Estudando um poco aqui no fórum refiz a Query e resolveu meu problema...

select
  CONTARESUMO.ddd, CONTARESUMO.NROTELEFO, CONTARESUMO.VALORASSI,
  coalesce(sum(BILHETACAO.DURAC_LIG),0) MINUTOS,
  coalesce(sum(BILHETACAO.VAL_LIGAC),0) VALOR,
  (select coalesce(sum(DESCONTOS.VAL_LIGAC),0) from DESCONTOS where DESCONTOS.NROTELEFO = CONTARESUMO.NROTELEFO and descontos.DTVENC_DE  = '27-sep-2010') DESCONTO,
  (select coalesce(sum(SERVICOS.VAL_LIGAC),0) from SERVICOS where SERVICOS.NROTELEFO = CONTARESUMO.NROTELEFO and SERVICOS.DTVENC_SE = '27-sep-2010') OUTROS_SERV,
 
  -- Calcula o total a pagar
  coalesce(sum(BILHETACAO.VAL_LIGAC),0) + CONTARESUMO.VALORASSI +
  + (select coalesce(sum(SERVICOS.VAL_LIGAC),0) from SERVICOS where SERVICOS.NROTELEFO = CONTARESUMO.NROTELEFO and SERVICOS.DTVENC_SE = '27-sep-2010')
  + (select coalesce(sum(DESCONTOS.VAL_LIGAC),0) from DESCONTOS where DESCONTOS.NROTELEFO = CONTARESUMO.NROTELEFO and descontos.DTVENC_DE  = '27-sep-2010') A_PAGAR
  
from
  CONTARESUMO
left join
  BILHETACAO on BILHETACAO.NROTELEFO=CONTARESUMO.NROTELEFO
  AND CONTARESUMO.DTVENCIME=bilhetacao.DTVENC_BI
  AND CONTARESUMO.DTVENCIME = '27-sep-2010'
group by
  CONTARESUMO.NROTELEFO, CONTARESUMO.ddd,  CONTARESUMO.VALORASSI
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar