none
Como se usa o OR exclusivo ? RRS feed

  • Pergunta

  • Como se usa o OR exclusivo ?

    Já deixei o Where de várias maneiras, e não consegui...

    Tab. Teste
    ano     int
    mes    int
    codP    int
    tipo    char(2) values ('F','B','C')
    SELECT ano, mes, codP, count(codP) FROM teste
    WHERE (tipo = 'F') ^ (tipo = 'B') ^ (tipo = 'C')
    GROUP BY ano, mes, codP
    ORDER BY ano, mes, codP
    Ou seja, a lógica é a seguinte.
    Para o codP = 1.
    Ex1:
    qdo houver apenas do tipo='F'
    o count tem que retornar = 1
    Ex2:
    quando houver os 2 tipos (F,B)
    o count tem que retornar = 1
    Ex3:
    quando houver os 3 tipos (F,B,C)
    o count tem que retornar = 1

    Obs: Não há como ter um codP e não ter um correspondente para o tipo.
    -
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    • Movido Gustavo Maia Aguiar quinta-feira, 13 de agosto de 2009 19:08 (De:SQL Server - Desenvolvimento Geral)
    terça-feira, 11 de agosto de 2009 18:17

Todas as Respostas

  • Ola, 

    Dúvida .. 
    o campo TIPO pode suportar apenas uma VOGAL por vez digo sempre vira preenchido com apenas F ou B ou C ? 

    Abraços. 

    Diogo A. Di Pietro
    terça-feira, 11 de agosto de 2009 18:37
  • Diogo, isso ai !!!

    Sim!!!
    -

    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    terça-feira, 11 de agosto de 2009 18:42
  • Boa tarde

    utilize a clausula in "Tipo IN ('F','B','C')"

    exemplo:








    SELECT
    ano, mes, codP, count(codP) FROM teste WHERE Tipo IN ('F','B','C') GROUP BY ano, mes, codP ORDER BY ano, mes, codP



    terça-feira, 11 de agosto de 2009 19:43
  • aNetão,

    A possível solução é utilizar o operador lógico condicional chamado IN.

    Este operador funcina como se fosse o operador OR, fazendo toda lógica condicional dentro dos valores passados a ele.

    O exemplo do Leonardo é a forma básica para aplicação deste operador.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 12 de agosto de 2009 03:26
  • Desculpem !

    Mas, não fizeram um teste simples como esse:
    CREATE TABLE teste (
    	  ano INT,
    	  mes INT   ,
    	  codP INT    ,
    	  tipo CHAR(1) );
    
    INSERT INTO teste VALUES (2009,7,10,'F')
    INSERT INTO teste VALUES (2009,7,10,'B')
    INSERT INTO teste VALUES (2009,7,10,'C')
    INSERT INTO teste VALUES (2009,7,15,'F')
    INSERT INTO teste VALUES (2009,7,20,'C')
    INSERT INTO teste VALUES (2009,7,25,'F')
    INSERT INTO teste VALUES (2009,7,25,'B')
    
    select * from teste
    
    SELECT ano, mes, codP, count(codP) AS num FROM teste
    WHERE tipo IN ('F','B','C') --(tipo = 'F') ^ (tipo = 'B') ^ (tipo = 'C')
    GROUP BY ano, mes, codP
    ORDER BY ano, mes, codP
    Resultado foi esse:
    ano         mes         codP        num
    ----------- ----------- ----------- -----------
    2009        7           10          3
    2009        7           15          1
    2009        7           20          1
    2009        7           25          2

    Novamente, ..... gostaria que fosse esse resultado:
    ano         mes         codP        num
    ----------- ----------- ----------- -----------
    2009        7           10          1
    2009        7           15          1
    2009        7           20          1
    2009        7           25          1
    -

    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    quarta-feira, 12 de agosto de 2009 11:24
  • UP !
    Se eu estiver respondendo a sua pergunta, e a mesma tiver utilidade. Vote com útil. Se for minha dúvida, e você me ajudar na solução, terei o maior prazer em votar como útil. Esse é o espírito do Forum MSDN !!! Valew !
    quarta-feira, 12 de agosto de 2009 18:39
  • aNetão,

    Seria isso:

    SELECT

    ano, mes, codP, count( distinct codP ) AS num
    FROM #teste
    WHERE tipo IN ('F','B','C') --(tipo = 'F') ^ (tipo = 'B') ^ (tipo = 'C')
    GROUP BY ano, mes, codP
    ORDER BY ano, mes, codP




    Anselmo Vicente
    quarta-feira, 12 de agosto de 2009 22:58
  • Boa Noite,

    Ando muito ocupado e com absolutamente nenhum tempo para responder. Em todo caso, me interessei por essa dúvida, porque ela não é tão simples quanto parece. Maiores detalhes em:

    A divisão relacional (quando o AND e o OR não funcionam)
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!360.entry

    [ ]s,

    Gustavo
    Classifique as respostas. O seu feedback é imprescindível
    quinta-feira, 13 de agosto de 2009 02:10