- Este tópico contém 3 respostas, 2 vozes e foi atualizado pela última vez 6 anos, 11 meses atrás por José Laurindo Chiappa.
-
AutorPosts
-
2 de janeiro de 2018 às 10:49 pm #109115Raphael de OliveiraParticipante
Olá!
Preciso agrupar resultados diferentes da mesma variável em uma linha apenas.
O seguinte select:
[color=#008800] SELECT DISTINCT CD_ATENDIMENTO,
Count(CD_ATENDIMENTO) CONT,
QTD_A AS SETOR_A,
QTD_B AS SETOR_B
FROM (SELECT DISTINCT CD_ATENDIMENTO,
CASE WHEN CD_TIPO_PENDENCIA = 42 THEN To_CHAR(HR_PENDENCIA,’DD/MM/YYYY HH24:MI:SS’) ELSE ” END AS QTD_A,
CASE WHEN CD_TIPO_PENDENCIA = 43 THEN To_CHAR(HR_PENDENCIA,’DD/MM/YYYY HH24:MI:SS’) ELSE ” END AS QTD_B
FROM pendencia_atendimentoWHERE CD_TIPO_PENDENCIA IN(42,43)
)GROUP BY CD_ATENDIMENTO,QTD_A,QTD_B
ORDER BY CD_ATENDIMENTO[/color]
Traz o seguinte resultado em anexo: Anexo_1
Mas gostaria que o resultado ficasse Assim: Anexo_2
Quem puder me ajudar, fico muito grato.
Obrigado!
Attachments:3 de janeiro de 2018 às 4:55 pm #109116José Laurindo ChiappaModeradorBlz ? 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
3 de janeiro de 2018 às 5:15 pm #109117Raphael de OliveiraParticipanteOlá!
Funcionou perfeitamente!
Muito obrigado pelas dicas.
Grande abraço
3 de janeiro de 2018 às 5:20 pm #109118José Laurindo ChiappaModeradorBlz… Mais importante do que aplicar a técnica é ter entendido os Conceitos que a fundamentam – espero ter atingido esse Objetivo, o que é sempre a minha intenção.
Abraços,
Chiappa
- 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…
-
AutorPosts
- Você deve fazer login para responder a este tópico.