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

使用MySQL查询选择多个总和,并在单独的列中显示它们,mysql,sql,pivot,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

假设我有一个假设表,这样记录了某个玩家在某个游戏中得分的情况:

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
或是作为支点

SELECT sum(if(name = 'mike',points,0)),
       sum(if(name = 'bob',points,0))
FROM `table
这称为数据透视表:

SELECT SUM(IF(name = "Bob", points, 0)) AS points_bob,
       SUM(IF(name = "Mike", points, 0)) AS points_mike
FROM score_table

您可以“手动”透视数据:

SELECT SUM(CASE WHEN name='bob' THEN points END) as bob,
       SUM(CASE WHEN name='mike' THEN points END) as mike
  FROM score_table
但如果您的玩家列表是动态的,这将不起作用。

在纯sql中:

SELECT
    sum( (name = 'bob') * points) as Bob,
    sum( (name = 'mike') * points) as Mike,
    -- etc
FROM score_table;

这个简洁的解决方案之所以有效,是因为mysql的布尔值对于
true
来说是
1
,对于
false
来说是
0
,允许您将测试的真值与数字列相乘。我已经多次用它来表示“支点”,我喜欢它的简洁。

球员的名字都是事先知道的吗?如果是,您可以执行以下操作:

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

如果不这样做,您可能仍然能够使用相同的方法,但是您可能必须动态地构建查询。基本上,您需要
选择不同的名称…
,然后使用该结果集来构建每个
CASE
语句,然后执行结果SQL。

您也可以使用pivot函数进行同样的操作。。即使使用性能台钳,使用枢轴进行枢轴旋转也是更好的选择。。。(我说的是oracle数据库)

您也可以对此使用以下查询。。 --(如果您的表中只有这两列,那么最好看到其他额外列的输出else,您将获得空值)

在这个查询中,您将很快获得数据,您只需添加或删除一个位置的球员姓名

:)

如果表中有超过这两列的内容,则可以使用以下查询

 WITH pivot_data AS (
            SELECT points,name 
  FROM   game_scores
  )
  SELECT *
  FROM   pivot_data
pivot (sum(points) for name in ('BOB' BOB, 'mike' MIKE));

他想要一个轴,这样名字就变成了列,而不是一个组。如果你按名字分组,他会得到一个对角矩阵。这非常有用,@manji。我也遇到了类似的问题,我尝试使用类似于“IF(name='bob',SUM(points),0)as bob”的东西,但它不起作用,因为SUM()将行合并为一行,IF()随后完成,或者看起来是这样。我不赞成非ANSI语法,但你在其他方面是对的,他说他使用的是MySQL,我确实喜欢类似函数的语法,因为它比较短。为了真正使这个pivot动态化,我会直接分组,在MySQL之外做pivot。在mysql中编程一个动态透视并不是那么容易。
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));