Ajuda com Seleção no Select
13/01/2012
0
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
Posts
16/01/2012
Paulo Vinicius
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
24/01/2012
Paulo Vinicius
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
03/02/2012
Nelson Villapouca
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.
Clique aqui para fazer login e interagir na Comunidade :)