Select com IF e Operações.

1. Select com IF e Operações.

Fernando Beraldo
LordFusion

(usa Debian)

Enviado em 19/11/2009 - 09:35h

Olá Pessoal,

Gostaria de ajuda para efetuar um select que faça uma verificação e depois da condição fazer um conta no caso de verdadeiro ou falso, e colocando esses valores em outra coluna . Seria algo conforme o exemplo abaixo:

Tabela “Rotas”
Data - Localidade - Km
2009-10-01 12:58:03 - 453 - 21
2009-10-06 11:47:10 - 102 - 30
2009-10-06 11:46:59 - 305 - 40

O select teria que fazer o seguinte:
SELECT * FROM rotas WHERE km (aqui entra a parte que não sei) Se for <= 30 coloca Total 30 se for maior que 30 faz a conta km / 6 = (se resultado da divisão for inteiro multiplica por 0,06) e joga o resultado na coluna Total.
Senão soma 1 ao resultado e multiplica por 0,06 e joga o resultado na coluna Total.
Exemplo:
60 / 6 = 10 -> 10 * 0,06 = 0,60
62 / 6 = 10.33 +1 = 11,33 -> 11,33 *0,06 = 0,6798

Ai o resultado teria que ser algo assim:

Tabela “Rotas”
Data - Localidade - Km - Total
2009-10-01 12:58:03 - 453 - 21 - 30
2009-10-06 11:47:10 - 102 - 30 - 30
2009-10-06 11:46:59 - 305 - 40 - 46

Por fim vem a pergunta é possível fazer esse tipo de operação no MySQL? Se possível poderiam me ajudar a faze - lá.

Desde já agradeço a ajuda de todos.
Abs.



  


2. Re: Select com IF e Operações.

Celso Lira
celso.lom

(usa Debian)

Enviado em 19/11/2009 - 20:11h

Ae veio! Falou!

SELECT *,
(SELECT CASE WHEN km <= 30 THEN 30 WHEN km>30 THEN (km/6)*0.06 end) AS total
FROM rotas;


3. Re: Select com IF e Operações.

Fernando Beraldo
LordFusion

(usa Debian)

Enviado em 20/11/2009 - 09:19h

Opa!!! Valeu Celso, é isso que preciso, no entanto preciso de mais uma ajuda, a conta da forma que você me passou só satisfaz a primeira condição: 60 / 6 = 10 -> 10 * 0,06 = 0,60.

A segunda conta: 62 / 6 = 10.33 +1 = 11,33 -> 11,33 *0,06 = 0,6798 o select não faz, logo o resultados das contas que o resto é diferente de inteiro ele traz igual.

Preciso tratar essa condição, e fazer essa conta, é possível?
Outra coisa estou fazendo um filtro de condições para pegar somente os valores que preciso na tabela (no meu exemplo está só o básico, a tabela é maior) assim se eu executar o select da conta sozinho vai blz, já quando junto como meu dá erro, creio que não estou sabendo unir os dois. Abaixo o select que uso para ter o resultado passado no exemplo.

SELECT data, localidade, km FROM rotas
WHERE DATE_FORMAT(data, '%Y-%m-%d')
BETWEEN '2009-10-01'
AND '2009-10-31'
AND motorista = 'carlos'
AND inicio LIKE 'D%'
AND fim LIKE 'D%'
AND carga = 'expressa'
AND localidade LIKE '2%';

Ai onde eu coloco o select da conta para ser filtrado junto com esse que já faço???

Abs e obrigado!!!



4. Re: Select com IF e Operações.

Celso Lira
celso.lom

(usa Debian)

Enviado em 01/12/2009 - 19:29h

Cara eu não tinha visto a segunda condição. Para satisfaze-la você vai precisar de um select dentro do outro:
SELECT *,
(SELECT CASE WHEN km <= 30 THEN 30 WHEN km>30 THEN (SELECT CASE WHEN MOD(km/6) > 0 THEN ((km/6)+1)*0.06 WHEN MOD(km/6) = 0 THEN (km/6)*0.06 end)) AS total

Você reparou a função MOD? Ela retorna o resto da divisão.

E quanto ao erro no select, você não precisa usar DATE_FORMAT e coloque a expressão (BETWEEN '2009-10-01' AND '2009-10-31') entre parenteses. Testa ae!


5. Re: Select com IF e Operações.

Fernando Beraldo
lordfusion

(usa Debian)

Enviado em 02/12/2009 - 09:23h

Opa...Cara valeu pela ajuda, cheguei a testar o que vc me falou e deu alguns erros de sintaxe, tanto na data quanto no conta.
Após sua primeira resposta continue minha pesquisa, e consegui fazer o que queria, ficou assim:

SELECT data, localidade, dst, km,
(SELECT CASE WHEN km >= 1 AND km <= 30 THEN ROUND(0.575,2) WHEN km > 30 AND (km%6 = 0) THEN ROUND((km/6)*0.115,2) ELSE ROUND(FLOOR((km/6)+1)*0.115,2) END) AS total
FROM rotas
WHERE DATE_FORMAT(data, '%Y-%m-%d')
BETWEEN '2009-11-01'
AND '2009-11-30'
AND motorista = 'carlos'
AND inicio LIKE 'D%'
AND fim LIKE 'D%'
AND carga = 'expressa'
AND localidade LIKE '2%';

Está funcionando certinho. Não sei se é a melhor maneira de fazer, mas o importante é que funciona, e com o tempo vou me aprimorando.
Gostei da parte do MOD que hoje faço com "%=0" vou testar isso e outras formas de tornar esse select mais dinâmico.

De qualquer maneira muito obrigado pela ajuda!!!


6. Re: Select com IF e Operações.

Fernando Beraldo
lordfusion

(usa Debian)

Enviado em 07/12/2009 - 17:55h

Cara, preciso de um outro help seu!!! rs..rs..

Estou quebrando a cabeça aqui para somar o resultado da campo "total"

No caso quero que todos os resultados sejam somando no final e me apareçam em uma única linha. Colocando por exemplo assim:
Motorista - Km
Carlos - 110
Onde o 110 seria a soma de todo o km desse motorista.
Como faço isso? Já tentei usar o SUM, mas não tem jeito. Cada hora dá um erro diferente.
Depois queria agrupar por localidade mas isso para depois.

Desde já agradeço.

Abs.