DISTINCT em consulta
Boa tarde galera, meu primeiro post aqui e espero que consiga a ajuda de vocês, tenho uma query a qual não estou conseguiu aplicar um distinct, segue ela:
Agradeço a ajuda!!!
select
UPPER(MES.DES_MES_ABR) + '/' + MES.DES_ANO AS MES_CONCLUSAO,
ALO.ID_ATENDIMENTO,
ALO.ID_PROTOCOLO,
CONVERT(CHAR(6),ALO.DT_ATENDIMENTO,112) AS ANO_MES,
CONVERT(VARCHAR(10),ALO.DT_ATENDIMENTO,103) AS DTA_ATENDIMENTO,
ALO.TMP_ATENDIMENTO,
ALO.FLAG_STATUS,
ALO.DESC_CAMINHO,
ALO.TP_SERVICO,
COUNT (CASE WHEN ALO.TMP_ATENDIMENTO <= '1900-01-01 01:00:00' THEN 1 END) AS DENTRO_SLA,
COUNT (CASE WHEN ALO.TMP_ATENDIMENTO > '1900-01-01 01:00:00' THEN 1 END) AS FORA_SLA
from dw.F_INDICADORES_ALO_COMERCIAL ALO
INNER JOIN dw.D_MES_MOVIMENTO MES ON CONVERT(CHAR(6),ALO.DT_ATENDIMENTO,112) = MES.COD_MES_MOVIMENTO
where (ALO.TP_SERVICO = 'Apoio Comercial'
OR ALO.TP_SERVICO = 'Assistente Comercial'
OR ALO.TP_SERVICO = 'Assistente Comercial - Apoio Back Administrativo'
OR ALO.TP_SERVICO = 'Apoio Comercial - Falhas na Boleta'
OR ALO.TP_SERVICO = 'Cadastro, Formalização e Garantias'
OR ALO.TP_SERVICO = 'Back Cartões'
OR ALO.TP_SERVICO = 'Gerenciador de Cartões'
OR ALO.TP_SERVICO = 'Contato Ativo com Gerente')
group by
ID_ATENDIMENTO,
ID_PROTOCOLO,
DT_ATENDIMENTO,
TMP_ATENDIMENTO,
FLAG_STATUS,
DESC_CAMINHO,
TP_SERVICO,
UPPER(MES.DES_MES_ABR) + '/' + MES.DES_ANO,
MES.COD_MES_MOVIMENTOAgradeço a ajuda!!!
Claudio Lague
Curtidas 0
Melhor post
Arthur Heinrich
09/01/2023
Tanto o distinct, quando o group by, tem por função agrupar valores.
No caso do distinct, o banco faz um sort no resultado e elimina as linhas repetidas.
No caso do group by, o banco faz o sort e, para cada tupla formada pelas colunas do agrupamento, ele retorna uma única linha, permitindo que outras colunas sejam agregadas, retornando por exemplo, a quantidade de linhas agrupadas, a soma de valores em outras colunas, ou o menor ou mais valor de determinada coluna, dentro do "grupo" de linhas que compartilham a mesma tupla do agrupamento.
Se você acrescenta uma coluna com alta granularidade, como uma PK ou outra coluna com muitos valores distintos, esta coluna acaba impedindo o agrupamento, visto que a cada linha retornada, esta coluna trás um valor distinto.
Tente descrever o que você espera retornar. Assim, poderemos sugerir uma maneira de chegar ao resultado esperado.
No caso do distinct, o banco faz um sort no resultado e elimina as linhas repetidas.
No caso do group by, o banco faz o sort e, para cada tupla formada pelas colunas do agrupamento, ele retorna uma única linha, permitindo que outras colunas sejam agregadas, retornando por exemplo, a quantidade de linhas agrupadas, a soma de valores em outras colunas, ou o menor ou mais valor de determinada coluna, dentro do "grupo" de linhas que compartilham a mesma tupla do agrupamento.
Se você acrescenta uma coluna com alta granularidade, como uma PK ou outra coluna com muitos valores distintos, esta coluna acaba impedindo o agrupamento, visto que a cada linha retornada, esta coluna trás um valor distinto.
Tente descrever o que você espera retornar. Assim, poderemos sugerir uma maneira de chegar ao resultado esperado.
GOSTEI 1
Mais Respostas
Claudio Lague
09/01/2023
Boa tarde galera, meu primeiro post aqui e espero que consiga a ajuda de vocês, tenho uma query a qual não estou conseguiu aplicar um distinct, segue ela:
Agradeço a ajuda!!!
select
UPPER(MES.DES_MES_ABR) + '/' + MES.DES_ANO AS MES_CONCLUSAO,
ALO.ID_ATENDIMENTO,
ALO.ID_PROTOCOLO,
CONVERT(CHAR(6),ALO.DT_ATENDIMENTO,112) AS ANO_MES,
CONVERT(VARCHAR(10),ALO.DT_ATENDIMENTO,103) AS DTA_ATENDIMENTO,
ALO.TMP_ATENDIMENTO,
ALO.FLAG_STATUS,
ALO.DESC_CAMINHO,
ALO.TP_SERVICO,
COUNT (CASE WHEN ALO.TMP_ATENDIMENTO <= '1900-01-01 01:00:00' THEN 1 END) AS DENTRO_SLA,
COUNT (CASE WHEN ALO.TMP_ATENDIMENTO > '1900-01-01 01:00:00' THEN 1 END) AS FORA_SLA
from dw.F_INDICADORES_ALO_COMERCIAL ALO
INNER JOIN dw.D_MES_MOVIMENTO MES ON CONVERT(CHAR(6),ALO.DT_ATENDIMENTO,112) = MES.COD_MES_MOVIMENTO
where (ALO.TP_SERVICO = 'Apoio Comercial'
OR ALO.TP_SERVICO = 'Assistente Comercial'
OR ALO.TP_SERVICO = 'Assistente Comercial - Apoio Back Administrativo'
OR ALO.TP_SERVICO = 'Apoio Comercial - Falhas na Boleta'
OR ALO.TP_SERVICO = 'Cadastro, Formalização e Garantias'
OR ALO.TP_SERVICO = 'Back Cartões'
OR ALO.TP_SERVICO = 'Gerenciador de Cartões'
OR ALO.TP_SERVICO = 'Contato Ativo com Gerente')
group by
ID_ATENDIMENTO,
ID_PROTOCOLO,
DT_ATENDIMENTO,
TMP_ATENDIMENTO,
FLAG_STATUS,
DESC_CAMINHO,
TP_SERVICO,
UPPER(MES.DES_MES_ABR) + '/' + MES.DES_ANO,
MES.COD_MES_MOVIMENTOAgradeço a ajuda!!!
Ah, o distinct é pelo ID_PROTOCLO hehe
GOSTEI 0