遇到此查询时遇到问题:
我有一张表,其中包含用户输入的每场战斗的条目。
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...
有什么想法吗?
感谢。
答案 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