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.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts