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 № 1Es 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