Fórum Retornar apenas valores que não se repetem num campo específico. #522317
09/06/2015
0
Estou precisando fazer um select que me retorne apenas os valores que não se repetem, pois é um sistema que possui várias etapas e dois tipos de operação (entrada e saída). Estou querendo dividir as etapas para os funcionários terem uma fácil e rápida visualização do que está pendente. Vou colocar aqui um pedaço da tabela mas que ilustra bem o que eu desejo.
É um banco firebird.
13 189129 0 06/06/2015 11:48:12 01 01 658 S
13 189129 0 06/06/2015 12:17:41 01 02 1 706 1 496 01 06/06/2015 11:48:12 P
13 189129 0 06/06/2015 12:48:53 02 01 1 706 1 496 12 06/06/2015 12:48:53 P
13 189129 0 06/06/2015 12:51:50 02 02 1 706 1 496 02 06/06/2015 12:48:53 P
13 189129 0 06/06/2015 14:05:57 05 01 1 60 1 540 02 06/06/2015 12:51:50 P
13 189129 0 08/06/2015 10:32:06 05 02 1 701 1 552 05 06/06/2015 14:05:57 P
13 189129 0 08/06/2015 10:32:06 10 01 1 701 1 552 05 08/06/2015 10:32:06 P
13 189129 0 08/06/2015 11:09:35 10 02 1 610 1 579 10 08/06/2015 10:32:06 P
Bom, como disse antes, quero dividir por etapas numa página PHP.
CDETAPA - etapa por onde está passando
CDOPERA - se é operação de entrada (01) ou saída (02). Quando entra em uma outra etapa (CDOPERA 01) sai automaticamenta da etapa anterior (ficando CDOPERA02 na etapa anterior)
Exemplo:
ETAPA 01
Quero que me retorne da seguinte maneira:
CDFIL | NRRQU | DATA | HORA | CDFUN
Onde NRRQU apenas mostre valores que passaram apenas pela CDETAPA 01 e CDOPERA 01.
Caso o NRRQU tenha passado pelo CDOPERA 02 da CDETAPA 01, não é para aparecer, pois ele já irá aparecer em outra etapa.
Espero que eu tenha sido claro, rs.
Grato pela ajuda!!
Ricardo Silva
Curtir tópico
+ 0Posts
09/06/2015
Marcos P
Gostei + 0
09/06/2015
Ricardo Silva
O que quero é:
Exemplo:
Quero mostrar somente os CDFIL e NRRQU que estão na CDETAPA 01 e apenas tenha passado pelo CDOPERA 01
Caso CDFIL + NRRQU apareça mais de uma vez, verifique o CDETAPA e CDOPERA, o CDETAPA sendo 01 e não tenha CDOPERA 02, printa na tela, mas caso já tenha o CDOPERA 02, não printa.
EDIT:
Consegui chegar à isso:
SELECT CDFIL, NRRQU, COUNT (*)
FROM FC12500
WHERE DATA >= '09.06.2015' AND CDETAPA = '01'
GROUP BY CDFIL, NRRQU
HAVING COUNT(*) = '01'
Ficou quase ao que eu quero, mas quando o CDOPERA é de um dia para outro, ou seja, entrou no 01 ontem e entrou no 02 hoje, aparece para mim na tela.
Não quero que esse que já tenha passado pelo CDOPERA 02 apareça para mim.
Gostei + 0
09/06/2015
Marcos P
Vá no Fiddle e crie a estrutura de dados e alguns registros...
Pode ser no MySql mesmo, pois seu select não parece ser muito particular que não funcione no Firebird.
Avise, depois dos dados colocados lá, para que possamos simular o que você precisa.
Gostei + 0
09/06/2015
Marcos P
SELECT CDFIL, NRRQU, COUNT (*) FROM FC12500 WHERE DATA >= '09.06.2015' AND CDETAPA = '01' GROUP BY CDFIL, NRRQU HAVING COUNT(*) = '01'
" HAVING COUNT(*) = '01' "... não funcionará pois o resultado de COUNT(*) é um inteiro e você está comparando isso com um string !
O que você quis fazer nessa construção ?
Ficou quase ao que eu quero, mas quando o CDOPERA é de um dia para outro, ou seja, entrou no 01 ontem e entrou no 02 hoje, aparece para mim na tela.
Não quero que esse que já tenha passado pelo CDOPERA 02 apareça para mim.
Não entendi essa parte... você poderia detalhar melhor ?
Se achar melhor coloque seu skype ou gtalk aqui, que conversamos por lá...
Gostei + 0
09/06/2015
Ricardo Silva
Utilizo o ibexpert e esta query funciona.
A idéia quando fiz esta query é que ela faça uma contagem de quantas vezes aparece um NRRQU na CDETAPA=01 a partir de uma data específica.
Bom, funciona, mas tem um problema:
CDETAPA 01 só aparecerá duas vezes, com CDOPERA 01 e CDOPERA 02
O problema é, se o CDETAPA 01 aparecer num dia com CDOPERA 01 (05.06.2015 por exemplo), e o CDOPERA 02 for inputado somente no dia seguinte (06.06.2015) e minha busca for a partir do dia 06.06.2015, vai aparecer para mim o NRRQU que está no CDETAPA 01 e CDOPERA 02.
Quando NRRQU passar pelo CDOPERA 02, eu não quero mais que ele apareça para mim.
Quero somente que apareçam os NRRQU que estão no CDOPERA 01 sem ter passado pelo CDOPERA 02.
Gostei + 0
09/06/2015
Marcos P
Gostei + 0
11/06/2015
Ricardo Silva
Conversando com Marcos P pelo skype, ele conseguiu resolver a query que eu desejava, vou deixar aqui a resposta de como foi resolvido:
SELECT CDFIL, NRRQU, CDOPERA
FROM FC12500 tab1
WHERE CDETAPA = '01' AND
NOT EXISTS (SELECT CDFIL, NRRQU, CDOPERA
FROM FC12500 tab2
WHERE tab1.CDFIL = tab2.CDFIL and tab1.NRRQU = tab2.NRRQU and tab2.CDOPERA = '02')
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)