假设我有一个假设的表格,以便某些游戏中的某些玩家得分时记录:
name points
------------
bob 10
mike 03
mike 04
bob 06
如何获得每位玩家得分的总和并在一个查询中并排显示?
总积分表
bob mike
16 07
我的(伪) - 查询是:
SELECT sum(points) as "Bob" WHERE name="bob",
sum(points) as "Mike" WHERE name="mike"
FROM score_table
答案 0 :(得分:18)
您可以“手动”转动数据:
SELECT SUM(CASE WHEN name='bob' THEN points END) as bob,
SUM(CASE WHEN name='mike' THEN points END) as mike
FROM score_table
但如果您的玩家列表是动态的,这将无效。
答案 1 :(得分:7)
在纯sql中:
SELECT
sum( (name = 'bob') * points) as Bob,
sum( (name = 'mike') * points) as Mike,
-- etc
FROM score_table;
这个简洁的解决方案可行,因为mysql的布尔值评估1
为true
而0
为false
,允许你倍增的真相使用数字列进行测试。我已经多次使用它作为“枢轴”,我喜欢简洁。
答案 2 :(得分:3)
播放器名称是否全部都在前面?如果是这样,你可以这样做:
SELECT SUM(CASE WHEN name = 'bob' THEN points ELSE 0 END) AS bob,
SUM(CASE WHEN name = 'mike' THEN points ELSE 0 END) AS mike,
... so on for each player ...
FROM score_table
如果不这样做,您仍然可以使用相同的方法,但您可能必须动态构建查询。基本上,你是SELECT DISTINCT name ...
,然后使用该结果集来构建每个CASE
语句,然后执行结果SQL。
答案 3 :(得分:2)
这称为转动表:
SELECT SUM(IF(name = "Bob", points, 0)) AS points_bob,
SUM(IF(name = "Mike", points, 0)) AS points_mike
FROM score_table
答案 4 :(得分:1)
SELECT sum(points), name
FROM `table`
GROUP BY name
或者是枢轴
SELECT sum(if(name = 'mike',points,0)),
sum(if(name = 'bob',points,0))
FROM `table
答案 5 :(得分:0)
你也可以使用枢轴功能同样的东西..即使通过性能老虎钳,使用枢轴进行旋转更好的选择...(我说的是oracle数据库)..
您也可以使用以下查询... - (如果你的表中只有这两列,那么最好看看其他附加列的输出else你会得到空值)
select * from game_scores
pivot (sum(points) for name in ('BOB' BOB, 'mike' MIKE));
在此查询中,您将获得非常快速的数据,并且您必须只添加或删除一个地方的玩家名称
:)
如果您的表中有这两列,那么您可以使用以下查询
WITH pivot_data AS (
SELECT points,name
FROM game_scores
)
SELECT *
FROM pivot_data
pivot (sum(points) for name in ('BOB' BOB, 'mike' MIKE));