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_MOVIMENTO
Agradeç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_MOVIMENTO
Agradeço a ajuda!!!
Ah, o distinct é pelo ID_PROTOCLO hehe
GOSTEI 0