/ / Jak sumować i mnożyć konkretne wartości przez liczbę w MYSQL? - mysql

Jak sumować i mnożyć określone wartości przez liczbę w MYSQL? - mysql

Mam tabelę zawierającą listę czynności wykonywanych przez osoby.

Po

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

To wygląda tak:

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

Teraz chciałbym pomnożyć akcję zniszczyć x75, przechwycić x500, wdrożyć x125 itd., Więc pierwszy wiersz powinien wyglądać następująco: (13 * 75 + 5 * 500 + 5 * 125 = 4100)

total   nick
4100    0xlne
75      13key

i tak dalej. Czy istnieje sposób na skorelowanie tych kilku typów działań z wartościami bez tworzenia nowej tabeli i łączenia ich przed pomnożeniem i sumowaniem?

Odpowiedzi:

0 dla odpowiedzi № 1

To kwestia użycia 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;

Przypis: ogólnie wielkie litery są używane dla słów zastrzeżonych SQL i małych dla nazw kolumn / tabel.


0 dla odpowiedzi nr 2

Użyj agregacji warunkowej i zsumuj wartości ważone:

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

Ekspresja

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

może być również napisane jako

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

Lub

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

Lub wiele innych sposobów.

Trochę inne podejście:

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