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?
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
Curtir tópico
+ 0
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
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
Clique aqui para fazer login e interagir na Comunidade :)