› Fóruns › SQL e PL/SQL › Agrupar resultados diferentes da mesma variável › Agrupar resultados diferentes da mesma variável
Blz ? Então, primeira coisa vc tem que entender dois conceitos :
- 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 456EVIDENTEMENTE 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 123aí 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…
-
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