2016-11-10 2 views
1

У меня есть таблица, содержащая список действий, совершаемых людьми.Как суммировать и умножать определенные значения на число в 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

Это вопрос использования CASE/КОГДА

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

Да, точно, я пытался upvote, однако у меня меньше, чем 15 репутации еще. Еще раз спасибо. –

0

использовать условные агрегацию и суммировать взвешенные значения:

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 

Or

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 
+0

Спасибо, это именно то, что я искал, но не знал этого конкретного ключевого слова –

Смежные вопросы