Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

LordFusion

Somar resultado de Select com Case

Recommended Posts

Olá pessoal,

 

Esse é meu primeiro post, e desde já quero agradecer a ajuda de todos! Estive fazendo umas pesquisas e achei algo relacionado ao meus problemas nesse fórum, no entanto testei o que tinha vista e não funcionou, por isso preciso de um help.

Minha dúvida é a seguinte, tenho o SELECT abaixo:

 

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%';

 

Gostaria de SOMAR o resultado do KM após o CASE, no casso hoje, com o SELECT acima aparece algo assim:

Data - Motorista - Localidade - Km - Total

2009-10-01 10:58:03 - Carlos - 453 - 21 - 30

2009-10-06 11:47:10 - Carlos - 102 - 23 - 98

2009-10-06 13:12:59 - Carlos - 323 - 40 - 46

2009-10-06 14:46:01 - Carlos - 387 - 34 - 55

 

Então após a soma teria que aparecer algo assim:

Motorista - Total

Carlos - 229

 

Basicamente é isso, tenho outras necessidades também, que envolvem UNION e VIEW, mas primeiro tenho que entender essa SOMA, para depois me virar com o resto.

 

Obrigado. :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa...fiz assim

 

SELECT data, localidade, dst, km,

(SELECT SUM(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%'

GROUP BY 'total';

 

...e deu certo. Muito obrigado :D E eu me matando, e era tão simples. (rs...rs...)

 

Agora me surgiu uma outra dúvida, para fazer a soma quando se usa UNION. Por exemplo tenho dois SELECT's conforme abaixo.

 

SELECT data, localidade, dst, km,

(SELECT SUM(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%'

GROUP BY 'total'

UNION

SELECT data, localidade, dst, km,

(SELECT SUM(CASE WHEN km >= 1 AND km <= 30 THEN ROUND(0.664,2) WHEN km > 30 AND (km%6 = 0) THEN ROUND((km/6)*0.225,2)

ELSE ROUND(FLOOR((km/6)+1)*0.225,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 '3%'

GROUP BY 'total';

 

Não sei se essa é a melhor maneira de fazer isso, mas como tenho localidades diferentes, cada uma delas usa um coeficiente de soma diferente. Do contrário colocaria todos no mesmo SELECT.

Então nessa, quando rodo esse select ele me traz duas linha com a soma de cada localidade. Algo assim:

Motorista - Total

Carlos - 324 (Sendo esse o resultado do primeiro select)

Carlos - 123 (E esse o resultado o segundo)

 

Agora preciso que esses valores sejam somadas para me retornar algo do tipo:

Motorista - Total

Carlos - 447

 

Como disse anteriormente estive pensando em usar uma VIEW onde eu colocaria esses dois SELECT'S, por exemplo:

 

CREATE VIEW vw_total_geral AS (Os dois selects aqui);

 

Para depois usar somar o resultado da VIEW:

 

SELECT SUM(total) FROM vw_total_geral;

 

Só que retorna esse erro quanto tento criar a VIEW: "CREATE VIEW command denied to user 'root'@'ipdomeuservidor' for table 'total_geral'

 

Estou pesquisando para ver o que pode ser, pois já dei as permissões necessários, pelo menos eu acho (rs). Vi algo sobre retirar as permissões e aplicá-las novamente.

 

Alguma sugestão de como poderia fazer a soma dos SELECT's e também arrumar esse problema da VIEW?

 

[]'s :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tive esse problema numa hospedagem tb... o suporte me indicou criar a view da seguinte forma:

 

CREATE ALGORITHM=UNDEFINED DEFINER=`usuario`@`%` SQL SECURITY INVOKER VIEW `banco`.`nome_da_view` AS SELECT ...

lembre-se de alterar os trechos que negritei

http://forum.imasters.com.br/public/style_emoticons/default/natal_happy.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

E aí Willian, tentei o que você disse e agora deu esse erro: Access denied; you need the SUPER privilege for this operation

 

Alguma outra sugestão?

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, não manjo 'tanto' de MySQL, mas entra em contato com a hospedagem, informa oque ocorre, e como você tentou. Realmente tá parecendo que teu usuário não tem privilégio para esse tipo de operação.

 

Qnto ao teu outro problema o GROUP BY, teria que ser 'pelo motorista', e não pelo 'total' ne?!

 

Se bem que não vejo motivo de você usar UNION ai, se criar o campo localidade na VIEW, você pode filtrar nela, ai faz apenas um SELECT para criar a VIEW

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, meu servidor é local. É de um sistema que a empresa usa, que agora estou tomando conta.

 

Referente o GROUP BY, tanto faz eu fazer pelo "motorista" ou pelo "total" o resultado é o mesmo.

 

Não entendi a parte de não usar o UNION, e também criar o campo localidade. Poderia dar um exemplo, se não for pedir de mais! ;)

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, acredito que ficaria:

SELECT data, localidade, dst, km,
(SELECT SUM(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, localidade 
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' 
GROUP BY 'total';
e então na hora de pesquisar você faria:

SELECT * FROM v_rotas WHERE localidade LIKE '2%' OR localidade LIKE '3%';#aqui já seria a VIEW

Compartilhar este post


Link para o post
Compartilhar em outros sites

...e então na hora de pesquisar você faria:

SELECT * FROM v_rotas WHERE localidade LIKE '2%' OR localidade LIKE '3%';#aqui já seria a VIEW

Hum...Muito bom, essa é uma outra maneira de fazer, pois eu teria um SELECT que é comum a todos e está dentro da VIEW, e depois varia um novo SELECT, com os filtros específicos.

 

Vou analisar sua sugestão, mas talvez ainda sim use o UNION, esse segundo select, vai para um outro sistema da empresa, e também para um terceiro, então minha idéia e esconder o máximo possível a estrutura do meu banco, para que os terceiros recebam somente o que precisam.

 

Basicamente seria esse o caminho né?!

 

Valeu!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.