none
CASE COUNT SEM REPETIR RRS feed

  • Pergunta

  • Opa eae galera blz?

    Bom como sempre nesse forum para pesquisar diversas duvidas muitas dela ja me ajudaram,

    hj to fazendo minha primeira pergunta e espero que alguem possa me ajudar 

    o que aconteçe é assim quando eu faço essa query

    SELECT ES.DEPADM,ES.NOMEDEP,ES.CDREDE,ES.DE,ES.CODMUN,ES.MUN,ES.DISTR,ES.COD_ESC,ES.NOMESC,
        MANHA         = CASE WHEN C.TURNO = 1  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END,
        INTERMEDIARIO = CASE WHEN C.TURNO = 2  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END,
        TARDE         = CASE WHEN C.TURNO = 3  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END,
        VESPERTINO    = CASE WHEN C.TURNO = 4  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END,
        NOITE         = CASE WHEN C.TURNO = 5  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END,
        INTEGRAL      = CASE WHEN C.TURNO = 6  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END
    INTO ##TURNO
    FROM ESCOLA ES
    JOIN CLASSES C ON ES.COD_ESC = C.COD_ESC
    GROUP BY ES.DEPADM,ES.NOMEDEP,ES.CDREDE,ES.DE,ES.CODMUN,ES.MUN,ES.DISTR,ES.COD_ESC,ES.NOMESC,TURNO,CLASSE

    ela me retorna valores repetidos por isso o motivo de jogar em uma temporaria pois logo em seguida eu executo essa

    SELECT DEPADM,NOMEDEP,CDREDE,DE,CODMUN,MUN,DISTR,COD_ESC,NOMESC,
    SUM(MANHA)AS MANHA,SUM(INTERMEDIARIO)AS INTERMEDIARIO,SUM(TARDE)AS TARDE,SUM(VESPERTINO)AS VESPERTINO,SUM(NOITE)AS NOITE,SUM(INTEGRAL)AS INTEGRAL
    FROM ##TURNO
    GROUP BY DEPADM,NOMEDEP,CDREDE,DE,CODMUN,MUN,DISTR,COD_ESC,NOMESC
    ORDER BY DE,NOMESC

    ai sim eu consigo obter os valores somados, agora a pergunta é teria como eu fazer isso direto ja somando e eliminando os valores repetidos?sem ter que precisar de jogar em uma temporaria

    bom por enquanto é so espero que alguem consiga me ajudar abraços a todos.

    quinta-feira, 18 de outubro de 2012 11:25

Respostas

  • Uelson,

    e por causa do group by por turno tambem.

    Dessa forma que você esta tentando fazer só vai funcionar com subselects.

    tente fazer dessa forma, ao invés de fazer o count você soma 1 quando o turno for o turno desejado e 0 quando não for

    SELECT ES.DEPADM,ES.NOMEDEP,ES.CDREDE,ES.DE,ES.CODMUN,ES.MUN,ES.DISTR,ES.COD_ESC,ES.NOMESC,
        MANHA         = SUM (CASE WHEN C.TURNO = 1  THEN 1 ELSE 0 END),
        INTERMEDIARIO = SUM (CASE WHEN C.TURNO = 2  THEN 1 ELSE 0 END),
        TARDE         = SUM (CASE WHEN C.TURNO = 3  THEN 1 ELSE 0 END),
        VESPERTINO    = SUM (CASE WHEN C.TURNO = 4  THEN 1 ELSE 0 END),
        NOITE         = SUM (CASE WHEN C.TURNO = 5  THEN 1 ELSE 0 END),
        INTEGRAL      = SUM (CASE WHEN C.TURNO = 6  THEN 1 ELSE  0 END) 
    FROM ESCOLA ES
    JOIN CLASSE C ON ES.COD_ESC = C.COD_ESC 
    GROUP BY ES.DEPADM,ES.NOMEDEP,ES.CDREDE,ES.DE,ES.CODMUN,ES.MUN,ES.DISTR,ES.COD_ESC,ES.NOMESC


    [ ]´s,
    Lukas Baldan

    • Marcado como Resposta Uelson.Jr quinta-feira, 18 de outubro de 2012 14:18
    quinta-feira, 18 de outubro de 2012 14:09

Todas as Respostas

  • Olá Uelson, bom dia.

    Para nos ajudar nas simulações, por favor, coloque os Create's Table das tabelas Escola e Classes.

    Além disso, coloque aqui alguns Inserts para já temos registros para testar o seu Select.

    Isso nos ajuda a abreviar o tempo dos testes e chegarmos ainda mais rapidamente a uma solução que lhe seja útil.

    Estamos no aguardo.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quinta-feira, 18 de outubro de 2012 11:28
    Moderador
  • Ola Uelson,

    acredito que é so tirar o campo "classe" do group by,

    SELECT ES.DEPADM,ES.NOMEDEP,ES.CDREDE,ES.DE,ES.CODMUN,ES.MUN,ES.DISTR,ES.COD_ESC,ES.NOMESC,
        MANHA         = CASE WHEN C.TURNO = 1  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END,
        INTERMEDIARIO = CASE WHEN C.TURNO = 2  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END,
        TARDE         = CASE WHEN C.TURNO = 3  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END,
        VESPERTINO    = CASE WHEN C.TURNO = 4  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END,
        NOITE         = CASE WHEN C.TURNO = 5  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END,
        INTEGRAL      = CASE WHEN C.TURNO = 6  THEN COUNT(DISTINCT C.CLASSE) ELSE 0 END 
    FROM ESCOLA ES
    JOIN CLASSES C ON ES.COD_ESC = C.COD_ESC 
    GROUP BY ES.DEPADM,ES.NOMEDEP,ES.CDREDE,ES.DE,ES.CODMUN,ES.MUN,ES.DISTR,ES.COD_ESC,ES.NOMESC,TURNO


    [ ]´s,
    Lukas Baldan


    quinta-feira, 18 de outubro de 2012 11:39
  • Ola Roberson,

    aqui um exemplo ma o menos rsrs de registros

    CREATE TABLE ESCOLA (
    DEPADM NVARCHAR (20),
    NOMEDEP NVARCHAR (20),
    CDREDE NVARCHAR (20),
    DE NVARCHAR (20),
    CODMUN NVARCHAR (20),
    MUN NVARCHAR (20),
    DISTR NVARCHAR (20),
    COD_ESC NVARCHAR (20),
    NOMESC NVARCHAR (20)
    )

    INSERT INTO ESCOLA (DEPADM,NOMEDEP,CDREDE,DE,CODMUN,MUN,DISTR,COD_ESC,NOMESC)
    VALUES ('1','PRIVADA','2222','SAO PAULO','100','100','00012','EXEMPLO1')

    INSERT INTO ESCOLA (DEPADM,NOMEDEP,CDREDE,DE,CODMUN,MUN,DISTR,COD_ESC,NOMESC)
    VALUES ('2','PRIVADA','33333','SAO PAULO','100','100','00024','EXEMPLO2')

    INSERT INTO ESCOLA (DEPADM,NOMEDEP,CDREDE,DE,CODMUN,MUN,DISTR,COD_ESC,NOMESC)
    VALUES ('3','PRIVADA','2444','SAO PAULO','100','100','00036','EXEMPLO3')

    CREATE TABLE CLASSE (
    COD_ESC NVARCHAR (20),
    NUMCLASSE NVARCHAR (20),
    TURNO NVARCHAR (20),
    SERIE NVARCHAR (20)
    )
    INSERT INTO CLASSE (COD_ESC,NUMCLASSE,TURNO,SERIE)
    VALUES ('00012','00001','1','8')

    INSERT INTO CLASSE (COD_ESC,NUMCLASSE,TURNO,SERIE)
    VALUES ('00012','00002','1','8')

    INSERT INTO CLASSE (COD_ESC,NUMCLASSE,TURNO,SERIE)
    VALUES ('00012','00003','1','8')

    INSERT INTO CLASSE (COD_ESC,NUMCLASSE,TURNO,SERIE)
    VALUES ('00012','00004','2','8')

    INSERT INTO CLASSE (COD_ESC,NUMCLASSE,TURNO,SERIE)
    VALUES ('00012','00005','2','8')

    INSERT INTO CLASSE (COD_ESC,NUMCLASSE,TURNO,SERIE)
    VALUES ('00012','00006','2','8')

    quinta-feira, 18 de outubro de 2012 13:57
  • Ola lukas,

    eu tentei a sua sugestao mais sem sucesso ele continua trazendo os valores repetido,

    eu so queria fazer desse modo pois ja excutava um processo a menos do que eu ter que jogar em uma

    temporaria e depois somar.

    quinta-feira, 18 de outubro de 2012 14:00
  • Uelson,

    e por causa do group by por turno tambem.

    Dessa forma que você esta tentando fazer só vai funcionar com subselects.

    tente fazer dessa forma, ao invés de fazer o count você soma 1 quando o turno for o turno desejado e 0 quando não for

    SELECT ES.DEPADM,ES.NOMEDEP,ES.CDREDE,ES.DE,ES.CODMUN,ES.MUN,ES.DISTR,ES.COD_ESC,ES.NOMESC,
        MANHA         = SUM (CASE WHEN C.TURNO = 1  THEN 1 ELSE 0 END),
        INTERMEDIARIO = SUM (CASE WHEN C.TURNO = 2  THEN 1 ELSE 0 END),
        TARDE         = SUM (CASE WHEN C.TURNO = 3  THEN 1 ELSE 0 END),
        VESPERTINO    = SUM (CASE WHEN C.TURNO = 4  THEN 1 ELSE 0 END),
        NOITE         = SUM (CASE WHEN C.TURNO = 5  THEN 1 ELSE 0 END),
        INTEGRAL      = SUM (CASE WHEN C.TURNO = 6  THEN 1 ELSE  0 END) 
    FROM ESCOLA ES
    JOIN CLASSE C ON ES.COD_ESC = C.COD_ESC 
    GROUP BY ES.DEPADM,ES.NOMEDEP,ES.CDREDE,ES.DE,ES.CODMUN,ES.MUN,ES.DISTR,ES.COD_ESC,ES.NOMESC


    [ ]´s,
    Lukas Baldan

    • Marcado como Resposta Uelson.Jr quinta-feira, 18 de outubro de 2012 14:18
    quinta-feira, 18 de outubro de 2012 14:09
  • LUKAS,

    AGORA FUNCIONOU PERFEITAMENTE, NAO TINHA PENSADO NESSA FORMA

    EU JA TINHA IMAGINADO QUE SERIA PELO FATO DO TURNO SO QUE COMO EU ESTAVA DANDO O COUNT

    EU PRECISAVA AGRUPAR ELE.

    AI COMO A MINHA INTEÇAO ERA CONTAR AS CLASSES POR TURNO EU ACHAVA QUE O CAMINHO SO IA DAR DAQUELE MODO

    OBRIGADO PELA ATENÇAO E UM GRANDE ABRAÇO .



    • Editado Uelson.Jr quinta-feira, 18 de outubro de 2012 14:37 RETIFICAÇAO
    quinta-feira, 18 de outubro de 2012 14:18