SubSelect retornando null

Firebird

16/02/2005

Pessoal estou com um problema

Estou tentando fazer um sql para selecionar a qtde de itens vendidos preciso somar nf + cupom.

Exemplo:
SELECT P.CODIGO,
(SELECT SUM(QTDE) FROM ITEMNF WHERE PRODUTO = P.CODIGO) ,
(SELECT SUM(QTDE) FROM ITEMCUPOM WHERE PRODUTO = P.CODIGO) FROM PRODUTO P

este me retorna uma coluna para cada total, mas eu gostaria que o retorno fosse em somente uma coluna.

Exemplo:
SELECT P.CODIGO,
(SELECT SUM(QTDE) FROM ITEMNF WHERE PRODUTO = P.CODIGO) +
(SELECT SUM(QTDE) FROM ITEMCUPOM WHERE PRODUTO = P.CODIGO) FROM PRODUTO P

mas neste caso se em uma das duas tabelas não houver ocorrencias vai me retornar ´null´.

Preciso encontrar uma solução.

[]Edison de Brito


Edison_br

Edison_br

Curtidas 0

Respostas

Gandalf.nho

Gandalf.nho

16/02/2005

Se estiver usando FB 1.5, tente usar a função COALESCE


GOSTEI 0
Edison_br

Edison_br

16/02/2005

Estou utilizando ib 6.0.2 já pesquisei em diversos locais e nada, infelizmente vou ter que fazer uma gambia, gambiarra, matação, nó de loco...


GOSTEI 0
Afarias

Afarias

16/02/2005

vc pode neste caso usar uma Procedure ou uma UDF (NVL)


T+


GOSTEI 0
Edison_br

Edison_br

16/02/2005

No caso de se utilizar uma procedure, como seria o procedimento
1 - Crio a procedure com duas variaveis cada uma com a soma de uma das tabelas e faço a verificação (IF) do valor se não for null alimento uma terceira variavel (output)?
2 - Mas como ficaria isto pois até onde sei eu não posso colocar um EXECUTE PROCEDURE em um select;


GOSTEI 0
Afarias

Afarias

16/02/2005

|1 - Crio a procedure com duas variaveis cada uma com a soma de uma
|das tabelas e faço a verificação (IF) do valor se não for null alimento
|uma terceira variavel (output)?

por ai... seria algo como:

if (val1 is null) then
val1 = 0;

if (val2 is null) then
val2 = 0;

resposta = val1 + val2;


|2 - Mas como ficaria isto pois até onde sei eu não posso colocar um
|EXECUTE PROCEDURE em um select;

set term ^;

create procedure SaidasProdutos 
returns (produto varchar(10), total integer) as
  declare variable sub1 integer;
  declare variable sub1 integer;
begin
  for SELECT P.CODIGO, 
    (SELECT SUM(QTDE) FROM ITEMNF WHERE PRODUTO = P.CODIGO) , 
    (SELECT SUM(QTDE) FROM ITEMCUPOM WHERE 
      PRODUTO = P.CODIGO) FROM PRODUTO P 
  into :produto, :sub1, :sub2 do
  begin
    if (sub1 is null) then
      sub1 = 0;
    if (sub2 is null) then
      sub2 = 0;
    total = sub1+sub2;
    suspend;
  end
end^


então vc usa o procedimento na forma:

select * from SaidasProdutos;


T+


GOSTEI 0
Edison_br

Edison_br

16/02/2005

Simplesmente perfeito, era bem isto que eu precisava.

Obrigado pela atenção.

Edison de Brito


GOSTEI 0
POSTAR