/ / Как да сумираме и умножаваме специфични стойности с число в MYSQL? - mysql

Как да сумира и умножава конкретни стойности с число в MYSQL? - mysql

Имам таблица, съдържаща списък от действия, извършени от лица.

След

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

тя изглежда така:

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

Сега, бих искал да умножа действието x75, да заснеме x500, да внедри x125 и така нататък, така че първият ред трябва да изглежда: (13 * 75 + 5 * 500 + 5 * 125 = 4100)

total   nick
4100    0xlne
75      13key

и така нататък. Има ли начин да се съпоставят тези няколко вида действия със стойности, без да се създава нова таблица, и да се присъединят към тях преди да се умножат и сумират?

Отговори:

0 за отговор № 1

Това е въпрос на използване на 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;

Като бележка под линия: обикновено се използват горни букви за SQL запазени думи и малки букви за имена на колони / таблици.


0 за отговор № 2

Използвайте условното агрегиране и сумирайте претеглените стойности:

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

Изразът

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

също може да бъде написано като

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

Или

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

Или много други начини.

Малко различен подход:

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