Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lucia.Souza

Desprezar Zeros e Nulos

Recommended Posts

Gente, poderiam me ajudar com uma query e um raciocínio?

 

 

Preciso carregar uma tabela com informações de uma outra, porém desprezando os registros zeros e nulos em todas as colunas.

 

 

Na minha tabela origem tenho um total de 164.906.857 registros. Select count(*) from ADMRDX.table;

 

 

Para saber quem são os registros que estão com 0 e nulos, fiz a seguinte consulta:

 

SELECT Count(*) Qtde
FROM ADMRDX.table
WHERE
(Campo_3 = 0 or Campo_3 is null)
And (Campo_4 = 0 or Campo_4 is null)
And (Campo_5 = 0 or Campo_5 is null)
And (Campo_6 = 0 or Campo_6 is null)
And (Campo_7 = 0 or Campo_7 is null)
And (Campo_8 = 0 or Campo_8 is null)
And (Campo_9 = 0 or Campo_9 is null)
And (Campo_10 = 0 or Campo_10 is null) ;
QTDE
17.124.413

 

 

Então, logo

164.906.857 => Count(*) da Tabela
17.124.413 => Quantidade de Registros Zerados ou Nulos
----------------
147.782.444 => Registros a ser carregados na tabela

 

 

 

Como faço pra dizer que NÃO QUERO os registros vindo com 0 e nulos? Eu fiz a consulta abaixo mas o resultado não bate.

 

SELECT Count(*) Qtde
FROM ADMRMS.table
WHERE NOT
(Campo_3 = 0 or Campo_3 is null)
And (Campo_4 = 0 or Campo_4 is null)
And (Campo_5 = 0 or Campo_5 is null)
And (Campo_6 = 0 or Campo_6 is null)
And (Campo_7 = 0 or Campo_7 is null)
And (Campo_8 = 0 or Campo_8 is null)
And (Campo_9 = 0 or Campo_9 is null)
And (Campo_10 = 0 or Campo_10 is null) ;

 

..... porém essa consulta retorna 136.094.578, ou seja, 11.687.866 estão se perdendo. Não existe nenhum outro filtro a não ser esse que mostrei ai em cima.

 

==>> Eu acho que não estou acertando a forma de desprezar os Zeros e Nulos. Apenas coloquei o NOT depois do where.

 

Alguém poderia me dar um help qto a isso?

 

Grata

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

1 Tente assim para a negação

 

 

SELECT Count(*) Qtde

FROM ADMRMS.table

WHERE NOT ( (Campo_3 = 0 or Campo_3 is null)And (Campo_4 = 0 or Campo_4 is null)And (Campo_5 = 0 or Campo_5 is null)And (Campo_6 = 0 or Campo_6 is null)And (Campo_7 = 0 or Campo_7 is null)And (Campo_8 = 0 or Campo_8 is null)And (Campo_9 = 0 or Campo_9 is null)And (Campo_10 = 0 or Campo_10 is null) ) ;

 

 

2 Use sum(1) no lugar do count(*) caso existeca chancecde TODOS os camoo de um ou registros possam estar nulos.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Não deu certo!

Para desprezar registros vindo zeros e nulos (negação), essa sintaxe está correta?

Os campos de 3 a 8 são campos que contém quantidades. O campos 9 e 10 são campos de valores.

Essa query acima, está trazendo valores nas colunas 9 e 10, ou seja, iria perder esses registros tbm e isso está errado.

Sem a cláusula NOT, mostra exatamente os valores que preciso descartar, ou seja, com todos os campos zero ou nulos.

Mas basta eu colocar o NOT que não dá certo.


EXISTE OUTRA FORMA DE DESPREZAR ESSES REGISTROS????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim para a afirmacao (todas as colunas)

select sum(1)
from tabela
where  (
              (nvl(campo1,0) = 0)
              and
              (nvl(campo2,0) = 0)
              and
              (nvl(campo3,0) = 0) 
              ...
         )

Para a negação

select sum(1)
from tabela
where not  (
              (nvl(campo1,0) = 0)
              and
              (nvl(campo2,0) = 0)
              and
              (nvl(campo3,0) = 0)
              ...
             )

Mas atente para :

 

Se todos os campos de um registro podem estar nulos .

 

Estamos falando de campo de tipo numéricos

Compartilhar este post


Link para o post
Compartilhar em outros sites

O resultado dessa query acima trás o mesmo resultado da minha. Acredito que esse WHERE NOT não seja correto, sei lá... Eu coloco where not e ainda tras registros válidos (com valores).

 

Estou conseguindo retornar todos os registros com valores zeros e nulos, porém não to conseguindo fazer a negativa disso.

 

Sim, todos esses campos são numéricos.

 

CREATE TABLE ADMRMS.Estoque
(
EstoqueID NUMBER(8,0) NOT NULL ENABLE,
LOC_TYPE VARCHAR2(1 BYTE) NOT NULL ENABLE,
LOCATION NUMBER(10,0) NOT NULL ENABLE,
ITEM VARCHAR2(25 BYTE) NOT NULL ENABLE,
HAND_QTY NUMBER(12,4),
IN_TRANSIT_QTY NUMBER(12,4),
UNIT_COST NUMBER(20,4),
UNIT_RETAIL NUMBER(20,4),
PHYSICAL_COUNT_QTY NUMBER(12,4),
PACK_COMP_QTY NUMBER(12,4) NOT NULL ENABLE,
IN_TRANSIT_AMT NUMBER(20,4),
DISTRIBUTE_QTY NUMBER(12,4),
CONSTRAINT "PK_STAKE_SKU_LOC" PRIMARY KEY ("EstoqueID", "LOC_TYPE", "LOCATION", "ITEM");

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.