Ajuda com Seleção no Select

13/01/2012

0

Olá Gurizada, primeiro tópico!!!

preciso pegar duas condições na tabela

Ex. de tabela:
Serial;Status
A;0
A;0
B;0
B;1
B;1
C;1
Legenta Status 0 = Bom; 1 = Ruin

Preciso contar quantas ocorrencias DISTINTAS de Serial+Status que tem de cada um
Resultado do Ex:
Serial A possui 1 ocorrencia de Bom ;
B 1 ocorrencia de status Bom e 1 Ruim;
C 1 Ruin

tentei algo como:

count(distinct(serial,cod_status))

mas este soma os dois resultados

e este:
SUM( CASE WHEN cod_status = 1 THEN 1 ELSE 0 END )

soma o resultado de todos, inclusive os duplicados.

Segue o SQL que está Errado:
SELECT distinct
	cod_prod,
	to_char(datah, DD/MM/YY),
	--SUM(1) AS registros,
	count(distinct serial) AS produzidos,
	count(distinct(serial,cod_status)) AS total,
	count(distinct(serial,cod_status)) - count(distinct serial) as NOK,
        SUM( CASE WHEN cod_status = 1 THEN 1 ELSE 0 END ) as total_NOK,
	 
	 --SUM( case when distinct(serial,cod_status) THEN 1 ELSE 0 END) AS TESTE,

	count(distinct serial) * 100.0 / count(distinct(serial,cod_status)) as yield
	
FROM tb_registro WHERE
	datah BETWEEN TO_timestamp(09/01/2012 00:00:00,DD/MM/YYYY HH24:MI:SS) 
			AND TO_timestamp(13/01/2012 23:59:59,DD/MM/YYYY HH24:MI:SS) 
			AND cod_prod LIKE %000298% 
GROUP BY cod_prod, to_char(datah, DD/MM/YY)
ORDER BY cod_prod, to_char(datah, DD/MM/YY)
Paulo Vinicius

Paulo Vinicius

Responder

Posts

16/01/2012

Paulo Vinicius

Mudei de Paradigma nesta lógica e parti para uma função que faz duas consultas que populam duas tabelas temporárias um com cada cod_status = 0,1.
Mas agora preciso uni-lás com os dois resultados.... preciso de uma ajuda na união das tabelas:

	SELECT 
	tb1.cod_prod,tb1.dia,tb1.nok,tb2.ok, ((tb2.ok * 100.0) / (tb1.nok + tb2.ok)) as percentu
	FROM tb1,tb2 WHERE
	tb1.cod_prod = tb2.cod_prod 
	AND	tb1.dia = tb2.dia 


Este código omite os resultados que não tem igual na tb2, o código abaixo também

	SELECT 
	tb1.cod_prod,tb1.dia,tb1.nok,tb2.ok, ((tb2.ok * 100.0) / (tb1.nok + tb2.ok)) as percentu
	FROM tb1 LEFT JOIN tb2 USING(cod_prod,dia);


Tentei também com o FULL JOIN...
mas este veio sem os resultados:

(000097,22/11/11,2,10,83.3333333333333333)
(000097,23/11/11,2,36,94.7368421052631579)
(,,,4,)

Se alguém puder compartilhar algum pensamento agradeço

Responder

24/01/2012

Paulo Vinicius

bom depois de um tempo resolvi fazer diferente...

O Enunciado é este: (Problema Real)
Mostrar os produtos por dia, e Contar os seriais (tirando os duplicados) que possuem o cod_Status = 0 (Zero) Excluindo os que estão repetidos no outro grupo onde o cod_Status = 1. na mesma tabela e no mesmo Dia.
Fiz assim:

	SELECT a.cod_prod, to_char(a.datah, DD/MM/YY) as dia, count(distinct(a.serial)) FROM tb_registro a
	WHERE
		cod_prod LIKE % || 11120 || % 
		AND date_trunc(month,  datah) =  TO_timestamp(1/2012,MM/YYYY)
		AND cod_status = 0
		AND
		serial not in ( SELECT serial FROM tb_registro WHERE cod_status = 1 AND  date_trunc(day,  a.datah) = date_trunc(day,  datah)  )
	GROUP BY cod_prod, dia
	ORDER BY cod_prod, dia;


Só que não sei se está certo, o banco possui muitas linhas e a subconsulta demora mais de 16 segundos para processar.

Podem me ajudar?
Obrigado.

Saída:
011120;13/01/12;11
011120;16/01/12;124
011120;17/01/12;24
011120;18/01/12;14
011120;19/01/12;6
011120;20/01/12;16
011120;21/01/12;84
011120;23/01/12;92
011120;24/01/12;94
Responder

03/02/2012

Nelson Villapouca

Opa,

A grosso modo, você pode contar os valores diferentes da seguinte forma:

SELECT
SERIAL ,
DATA ,
STATUS ,
COUNT(*)
FROM
TABELA
GROUP BY
SERIAL ,
DATA ,
STATUS

A partir dessa idéia, você vai ter para cada data, serial e status a quantidade de ocorrências. Daí você pode refinar...
Espero que ajude.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar