如何为每个用户获得每个类别的总计?

时间:2017-09-19 12:31:38

标签: mysql

遇到此查询时遇到问题:

我有一张表,其中包含用户输入的每场战斗的条目。

user_id | name   | category | points
==================================
1       | user1  | battle1  | 4
54      | user2  | battle1  | 20
88      | user 8 | battle4  | 33
etc

共有4个类别。

我希望我能正确解释这一点。

我需要做的是为每个用户获取每个类别的总和,同时也从其他类别中显示该用户的总数。

现在我可以按用户查询一个类别的总和:

SELECT user_id, name, category,  SUM(points) 
FROM battle_points 
WHERE user_id = id 
GROUP BY category 

但我不希望每个用户使用它。因此,如果我在没有WHERE子句的情况下进行查询,那么一切都搞砸了。

我需要为每个类别排名前10位。所以它可能是这样的:

name  | cat 1 | cat 2 | cat 3 | cat 4
=====================================
user1 | 33    | 0     | 49    | 5
user2 | 0     | 55    | 12    | 3
etc...

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容:(我更改了您的表名,为了简化我的测试,我使用CATEGORY作为INT,但您可以轻松更改它)

CREATE TABLE BAT_POI (USER_ID INTEGER, NAME VARCHAR(20), CATEGORY INT, POINTS INT);
INSERT INTO BAT_POI VALUES (1,'user1',1,4);
INSERT INTO BAT_POI  VALUES (54,'user2',1,20);
INSERT INTO BAT_POI  VALUES (88,'user8',4,33);
INSERT INTO BAT_POI  VALUES (1,'user1',3,49);

SELECT USER_ID, NAME
        , SUM( CASE WHEN CATEGORY=1 THEN POINTS ELSE 0 END ) AS CAT1
        , SUM( CASE WHEN CATEGORY=2 THEN POINTS ELSE 0 END ) AS CAT2
        , SUM( CASE WHEN CATEGORY=3 THEN POINTS ELSE 0 END ) AS CAT3
        , SUM( CASE WHEN CATEGORY=4 THEN POINTS ELSE 0 END ) AS CAT4
FROM BAT_POI
GROUP BY USER_ID, NAME;

输出:

USER_ID NAME    CAT1    CAT2    CAT3    CAT4
1       user1   4       0       49      0
54      user2   20      0       0       0
88      user8   0       0       0       33