使用MySQL查询选择多个和,并将它们显示在单独的列中

时间:2011-06-20 23:49:05

标签: mysql sql pivot

假设我有一个假设的表格,以便某些游戏中的某些玩家得分时记录:

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

6 个答案:

答案 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的布尔值评估1true0false,允许你倍增的真相使用数字列进行测试。我已经多次使用它作为“枢轴”,我喜欢简洁。

答案 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));