/ / ¿Cómo sumar y multiplicar valores específicos por un número en MYSQL? - mysql

¿Cómo sumar y multiplicar valores específicos por un número en MYSQL? - mysql

Tengo una tabla que contiene una lista de acciones realizadas por personas.

Después

SELECT COUNT(NICK) AS TOTAL, NICK, ACTION FROM ACTIONS2  GROUP BY ACTION,NICK ORDER BY NICK ASC, TOTAL DESC

se parece a esto:

total   nick    action
13      0xlne   destroyed
5       0xlne   captured
5       0xlne   deployed
1       13key   destroyed
2       74pawel deployed
1       74pawel destroyed
1       74pawel captured

Ahora, me gustaría multiplicar la acción destrozar x75, capturar x500, desplegar x125 y así sucesivamente, así debería verse la primera fila: (13 * 75 + 5 * 500 + 5 * 125 = 4100)

total   nick
4100    0xlne
75      13key

y así. ¿Hay una manera de correlacionar estos pocos tipos de acciones con valores sin crear una nueva tabla y unirlos antes de multiplicar y sumar?

Respuestas

0 para la respuesta № 1

Es cuestión de usar CASE / WHEN

SELECT
SUM(CASE WHEN action="destroyed" THEN total*75 WHEN action="captured"   THEN total*500 ELSE total*125 END), nick
FROM (SELECT COUNT(NICK) AS TOTAL, NICK, ACTION FROM ACTIONS2  GROUP BY ACTION,NICK ORDER BY NICK ASC, TOTAL DESC) AS nicks
GROUP by nick;

Como nota a pie de página: generalmente se usa mayúsculas para las palabras reservadas de SQL y minúsculas para los nombres de columnas / tablas.


0 para la respuesta № 2

Utilice la agregación condicional y sume los valores ponderados:

SELECT NICK, COUNT(*) AS totalAction
COALESCE(SUM(ACTION="destroyed"),0)*75 +
COALESCE(SUM(ACTION="capture"),0)*500 +
COALESCE(SUM(ACTION="deploy"),0)*125
as totalPoints
FROM ACTIONS2
GROUP BY NICK
ORDER BY NICK ASC, totalAction DESC

La expresion

COALESCE(SUM(ACTION="destroyed"),0)*75

también puede ser escrito como

COUNT(CASE WHEN ACTION="destroyed" THEN 1 END)*75

O

COUNT(ACTION="destroyed" OR NULL)*75

O muchas otras formas.

Un enfoque un poco diferente:

SELECT NICK, COUNT(*) AS totalAction,
SUM(
CASE ACTION
WHEN "destroyed" THEN 75
WHEN "capture"   THEN 500
WHEN "deploy"    THEN 125
ELSE 0
END
) as totalPoints
FROM ACTIONS2
GROUP BY NICK
ORDER BY NICK ASC, totalAction DESC