Имам таблица, съдържаща списък от действия, извършени от лица.
След
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