Pular para o conteúdo

Fóruns SQL e PL/SQL Agrupar resultados diferentes da mesma variável Agrupar resultados diferentes da mesma variável

#109116
Avatar photoJosé Laurindo Chiappa
Moderador

    Blz ? Então, primeira coisa vc tem que entender dois conceitos :

    1. o DISTINCT atua a nível de REGISTRO, ie, se vc tiver vários REGISTRO com os MESMOS EXATOS CAMPOS com os MESMOS VALORES TODOS, aí sim o DISTINCT remove a duplicidade…
      Assim, se vc tiver um resultset tipo :

      coluna1 coluna2 coluna 3
      1 ABC 123
      1 ABC 456

      EVIDENTEMENTE o DISTINCT aí Não Serve de Coisíssima ALGUMA, sim ??? Pois há um valor diferente que seja, pronto, o registro NÂO VAI SER CONSIDERADO uma duplicidade…. Só se o teu resultset fosse :

      coluna1 coluna2 coluna 3
      1 ABC 123
      1 ABC 123

      aí SIM o DISTINCT ia ser efetivo, retornando só um registro…. Isso tá muito bem explicado na Documentação e em links de ref como https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212 …. Por isso questiono, SERÁ que essa montoeira de DISTINCTs que vc enfiou na sua query principal E nas sub-queries tá funcionando ?? Talvez não, VERIFIQUE isso…

    2. sobre o mecanismo do GROUP BY : a idéia dele é vc JUNTAR registros, ‘colando’ n registros em um só e nesse único registro resultante vc pode ter uma Contagem, um MIN, um MAX, uma soma, etc, dos registros ‘juntados’… Por exemplo, digamos que eu tenha estes dados :

    DESENV:SQL>select deptno, ename, sal from scott.emp order by deptno;

    DEPTNO ENAME SAL


       10 CLARK           2450
       10 KING            5000
       10 MILLER          1300
       20 JONES           2975
       20 FORD            3000
       20 ADAMS           1100
       20 SMITH            800
       20 SCOTT           3000
       30 WARD            1250
       30 TURNER          1500
       30 ALLEN           1600
       30 JAMES            950
       30 BLAKE           2850
       30 MARTIN          1250
    

    14 linhas selecionadas.

    DESENV:SQL>

    Se eu montar um Grupo com DEPTNO como chave, os n registros de cada departamento seriam ‘fundidos’ num só, e para cada valor chave do grupo eu posso ter um MAX, MIN, SUM, etc… Digamos que eu opte por uma Contagem :

    DESENV:SQL>select deptno, count(ENAME) from scott.emp group by DEPTNO order by deptno;

    DEPTNO COUNT(ENAME)


       10            3
       20            5
       30            6
    

    DESENV:SQL>

    Ou seja, os 3 registros com empregados do depto 10 foram fundidos num só E eu contei quantos foram juntados, os 5 empregados do departamento 20 foram ‘colados’ num só registro e eu contei a quantidade de registros juntados e cheguei em 5, assim por diante….

    EVIDENTEMENTE, as chaves TEM que se repetir nos registros não agrupados : veja que o nome do empregado no meu caso não se repete (é único) então um eventual GROUP BY DEPTO, ENAME simplesmente Não Ia Funcionar, eu teria n grupos compostos de um só registro…..

    ===> Tão claros os DOIS conceitos ?? Se sim, agora vem a sua resposta : primeiro verifique esse seu GROUP BY, pois pelo que eu entendi, a agrupação que vc quer seria pelo CD_ATENDIMENTO então esse GROUP BY CD_ATENDIMENTO,QTD_A,QTD_B não faria sentido ….
    Agora, se é isso mesmo que vc quer e teu objetivo é simplesmente eliminar os NULLs talvez vc possa simplesmente usar um MAX em cima de cada grupo : veja https://stackoverflow.com/questions/14241429/sql-query-to-group-a-column-and-ignore-null-values para exemplo, o cara tinha um grupo :

    Col1|Col2|Col3| Col4
    |——————–
    |1 | | a | |
    |1 | b | | |
    |1 | | | c |
    |2 | e | | |
    |2 | | f | |
    |2 | | | g |

    e queria Eliminar os nulos, chegando em :

    | COL1 | COL2 | COL3 | COL4 |

    | 1 | b | a | c |
    | 2 | e | f | g |

    a resposta foi :

    select
    col1,
    max(col2) col2,
    max(col3) col3,
    max(col4) col4
    from yourtable
    group by col1;

    ====>>>> PERCEBA que a Solução foi agrupar apenas pela COL1 como chave – POR ISSO eu questionei E questiono esse teu GROUP BY CD_ATENDIMENTO,QTD_A,QTD_B, pelo que entendi na verdade seria GROUP BY CD_ATENDIMENTO com os MAX(QTD_A) e MAX(QTD_B) eliminando os nulos….

    []s

    Chiappa