Grupo By com Cláusula Where - Firebird 2
Bom dia Amigos,
Ainda não consegui compreender o conceito, por este motivo , peço a ajuda de vcs ... Estou com uma outra query , onde tenho por objetivo fazer uma soma total de um determinado campo e a partir dessa soma criar a estratégia de regras na aplicação ... Porém , quando coloca o "SUM" na tabela e o group by .. o mesmo não retorna o esperado..
Pode me ajudar ?
SELECT
SUM(A.QTDE_ENTREGAS) As TOTAL_ENTREGAS,
A.PESO,
A.ID_VIAGEM,
A.EMPRESA,
A.NOTA,
A.QTDE_ENTREGAS,
A.ORIGEM,
A.DESTINO,
A.QUANTIDADE,
A.TOTAL_FRE,
A.VALOR_PRODUTO,
A.DISTANCIA_PERCORRIDA,
(CASE
WHEN (SUM(A.QTDE_ENTREGAS) <= 150) THEN 1.00
WHEN (SUM(A.QTDE_ENTREGAS) BETWEEN 151 AND 180) THEN 2.50
WHEN (SUM(A.QTDE_ENTREGAS) BETWEEN 181 AND 220) THEN 3.00
WHEN (SUM(A.QTDE_ENTREGAS) > 221) THEN 4.00
ELSE 0
END) * SUM(A.QTDE_ENTREGAS) AS VLR_BONUS_QTDENTREGA,
B.ID,
B.NUMERO,
B.DATA,
D.PLACA,
D.DESCRICAO,
D.ID_TIPOVEICULO,
B.COMISSAO,
B.VALPAGMOT,
B.OBS,
B.HORA_INCLUSAO,
B.USUARIO,
B.ID_MOTORISTA,
CASE
WHEN (M.OBS LIKE ('%MOTORISTA BAÚ%')) THEN 'BAU'
ELSE 'FROTA'
END As TIPO_MOT,
M.ID,
M.EMPRESA,
M.NOME,
M.CPF,
C.ID,
C.DATASAIDA,
C.HORASAIDA,
C.DATACHEGA,
C.HORACHEGA,
DATEDIFF(DAY FROM C.DATASAIDA TO CAST(C.DATACHEGA AS DATE)) As DIAS_VIAG,
(C.HORACHEGA - C.HORASAIDA) / 3600 As Horas,
CASE
WHEN (C.HORACHEGA - C.HORASAIDA) / 3600 between 12 and 23.9 THEN
(DATEDIFF(DAY FROM C.DATASAIDA TO CAST(C.DATACHEGA AS DATE)) + 1)
WHEN (C.HORACHEGA - C.HORASAIDA) / 3600 between 24 and 47.9 THEN
(DATEDIFF(DAY FROM C.DATASAIDA TO CAST(C.DATACHEGA AS DATE)) + 2)
ELSE (DATEDIFF(DAY FROM C.DATASAIDA TO CAST(C.DATACHEGA AS DATE)))
END As DIAS_MAIS_HORAS,
C.COMISSAO,
C.KM_INICIAL,
C.KM_FINAL,
(C.KM_FINAL - C.KM_INICIAL) AS KM_TOTAL,
C.DESP_PAGAS,
C.TOT_DESP,
C.TOT_FRETE,
C.LUCRO,
C.VAL_COM,
C.USUARIO_ALTERACAO,
C.USUARIO
FROM
ENTREGAS A INNER JOIN VIAGENS C ON A.ID_VIAGEM = C.ID
INNER JOIN ACERTOS B ON B.ID = C.ID_ACERTO
INNER JOIN CAMINHOES D ON C.ID_VEICULO = D.ID
INNER JOIN MOTORISTAS M ON B.ID_MOTORISTA = M.ID
WHERE M.ID = 16
AND B.DATA BETWEEN ('25.07.2020') AND ('26.08.2020')
AND A.EMPRESA IN ('1','2','4','5')
AND B.EMPRESA IN ('1','2','4','5')
AND C.EMPRESA IN ('1','2','4','5')
AND M.SITUACAO = 'A'
AND A.QTDE_ENTREGAS IS NOT NULL
GROUP BY
A.PESO,
A.ID_VIAGEM,
A.EMPRESA,
A.NOTA,
A.QTDE_ENTREGAS,
A.ORIGEM,
A.DESTINO,
A.QUANTIDADE,
A.TOTAL_FRE,
A.VALOR_PRODUTO,
A.DISTANCIA_PERCORRIDA,
A.QTDE_ENTREGAS,
B.ID,
B.NUMERO,
B.DATA,
D.PLACA,
D.DESCRICAO,
D.ID_TIPOVEICULO,
B.COMISSAO,
B.VALPAGMOT,
B.OBS,
B.HORA_INCLUSAO,
B.USUARIO,
B.ID_MOTORISTA,
M.OBS,
M.ID,
M.EMPRESA,
M.NOME,
M.CPF,
C.ID,
C.DATASAIDA,
C.HORASAIDA,
C.DATACHEGA,
C.HORACHEGA,
C.DATASAIDA,
C.HORACHEGA,
C.HORACHEGA,
C.COMISSAO,
C.KM_INICIAL,
C.KM_FINAL,
C.KM_FINAL,
C.DESP_PAGAS,
C.TOT_DESP,
C.TOT_FRETE,
C.LUCRO,
C.VAL_COM,
C.USUARIO_ALTERACAO,
C.USUARIO
Ainda não consegui compreender o conceito, por este motivo , peço a ajuda de vcs ... Estou com uma outra query , onde tenho por objetivo fazer uma soma total de um determinado campo e a partir dessa soma criar a estratégia de regras na aplicação ... Porém , quando coloca o "SUM" na tabela e o group by .. o mesmo não retorna o esperado..
Pode me ajudar ?
SELECT
SUM(A.QTDE_ENTREGAS) As TOTAL_ENTREGAS,
A.PESO,
A.ID_VIAGEM,
A.EMPRESA,
A.NOTA,
A.QTDE_ENTREGAS,
A.ORIGEM,
A.DESTINO,
A.QUANTIDADE,
A.TOTAL_FRE,
A.VALOR_PRODUTO,
A.DISTANCIA_PERCORRIDA,
(CASE
WHEN (SUM(A.QTDE_ENTREGAS) <= 150) THEN 1.00
WHEN (SUM(A.QTDE_ENTREGAS) BETWEEN 151 AND 180) THEN 2.50
WHEN (SUM(A.QTDE_ENTREGAS) BETWEEN 181 AND 220) THEN 3.00
WHEN (SUM(A.QTDE_ENTREGAS) > 221) THEN 4.00
ELSE 0
END) * SUM(A.QTDE_ENTREGAS) AS VLR_BONUS_QTDENTREGA,
B.ID,
B.NUMERO,
B.DATA,
D.PLACA,
D.DESCRICAO,
D.ID_TIPOVEICULO,
B.COMISSAO,
B.VALPAGMOT,
B.OBS,
B.HORA_INCLUSAO,
B.USUARIO,
B.ID_MOTORISTA,
CASE
WHEN (M.OBS LIKE ('%MOTORISTA BAÚ%')) THEN 'BAU'
ELSE 'FROTA'
END As TIPO_MOT,
M.ID,
M.EMPRESA,
M.NOME,
M.CPF,
C.ID,
C.DATASAIDA,
C.HORASAIDA,
C.DATACHEGA,
C.HORACHEGA,
DATEDIFF(DAY FROM C.DATASAIDA TO CAST(C.DATACHEGA AS DATE)) As DIAS_VIAG,
(C.HORACHEGA - C.HORASAIDA) / 3600 As Horas,
CASE
WHEN (C.HORACHEGA - C.HORASAIDA) / 3600 between 12 and 23.9 THEN
(DATEDIFF(DAY FROM C.DATASAIDA TO CAST(C.DATACHEGA AS DATE)) + 1)
WHEN (C.HORACHEGA - C.HORASAIDA) / 3600 between 24 and 47.9 THEN
(DATEDIFF(DAY FROM C.DATASAIDA TO CAST(C.DATACHEGA AS DATE)) + 2)
ELSE (DATEDIFF(DAY FROM C.DATASAIDA TO CAST(C.DATACHEGA AS DATE)))
END As DIAS_MAIS_HORAS,
C.COMISSAO,
C.KM_INICIAL,
C.KM_FINAL,
(C.KM_FINAL - C.KM_INICIAL) AS KM_TOTAL,
C.DESP_PAGAS,
C.TOT_DESP,
C.TOT_FRETE,
C.LUCRO,
C.VAL_COM,
C.USUARIO_ALTERACAO,
C.USUARIO
FROM
ENTREGAS A INNER JOIN VIAGENS C ON A.ID_VIAGEM = C.ID
INNER JOIN ACERTOS B ON B.ID = C.ID_ACERTO
INNER JOIN CAMINHOES D ON C.ID_VEICULO = D.ID
INNER JOIN MOTORISTAS M ON B.ID_MOTORISTA = M.ID
WHERE M.ID = 16
AND B.DATA BETWEEN ('25.07.2020') AND ('26.08.2020')
AND A.EMPRESA IN ('1','2','4','5')
AND B.EMPRESA IN ('1','2','4','5')
AND C.EMPRESA IN ('1','2','4','5')
AND M.SITUACAO = 'A'
AND A.QTDE_ENTREGAS IS NOT NULL
GROUP BY
A.PESO,
A.ID_VIAGEM,
A.EMPRESA,
A.NOTA,
A.QTDE_ENTREGAS,
A.ORIGEM,
A.DESTINO,
A.QUANTIDADE,
A.TOTAL_FRE,
A.VALOR_PRODUTO,
A.DISTANCIA_PERCORRIDA,
A.QTDE_ENTREGAS,
B.ID,
B.NUMERO,
B.DATA,
D.PLACA,
D.DESCRICAO,
D.ID_TIPOVEICULO,
B.COMISSAO,
B.VALPAGMOT,
B.OBS,
B.HORA_INCLUSAO,
B.USUARIO,
B.ID_MOTORISTA,
M.OBS,
M.ID,
M.EMPRESA,
M.NOME,
M.CPF,
C.ID,
C.DATASAIDA,
C.HORASAIDA,
C.DATACHEGA,
C.HORACHEGA,
C.DATASAIDA,
C.HORACHEGA,
C.HORACHEGA,
C.COMISSAO,
C.KM_INICIAL,
C.KM_FINAL,
C.KM_FINAL,
C.DESP_PAGAS,
C.TOT_DESP,
C.TOT_FRETE,
C.LUCRO,
C.VAL_COM,
C.USUARIO_ALTERACAO,
C.USUARIO
Victor Andrade
Curtidas 0
Respostas
Leandro Chiodini
08/09/2020
Bom dia Victor Andrade
Tudo certo, algo de estranho tem no teu Select
Repare que a clausula Group By esta listando alguns campos mais de 1 vez,
O interessante seria você informar o que esta errado somente seu calculo?
Qual seria o objetivo total do seu Select?
Como você esta agrupando nesse caso por datas pode dar uma grande diferença visto que quando você agrupa ele somente agrupara os valores iguais.
O ideal seria para esse tipo de calculo não buscar todas as informações para serem tratadas em uma possível Grid e caso isso seja necessário, precisa dar uma olhada em como seria este componente se ´precisara destas informações e se realmente eles precisam ser agrupadas assim por datas como você esta fazendo.
Tudo certo, algo de estranho tem no teu Select
Repare que a clausula Group By esta listando alguns campos mais de 1 vez,
O interessante seria você informar o que esta errado somente seu calculo?
Qual seria o objetivo total do seu Select?
Como você esta agrupando nesse caso por datas pode dar uma grande diferença visto que quando você agrupa ele somente agrupara os valores iguais.
O ideal seria para esse tipo de calculo não buscar todas as informações para serem tratadas em uma possível Grid e caso isso seja necessário, precisa dar uma olhada em como seria este componente se ´precisara destas informações e se realmente eles precisam ser agrupadas assim por datas como você esta fazendo.
GOSTEI 0