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