Выберите несколько сумм с запросом MySQL и покажите их в отдельных столбцах

Скажем, у меня есть гипотетическая таблица, так что записи, когда какой-то игрок в какой-то игре оценивает точку:

name   points
------------
bob     10
mike    03
mike    04
bob     06

Как мне получить сумму очков каждого игрока и отображать их бок о бок в одном запросе?

Таблица общих точек

bob   mike
16     07

Мой (псевдо) -query:

SELECT sum(points) as "Bob" WHERE name="bob",
       sum(points) as "Mike" WHERE name="mike"
  FROM score_table

Ответ 1

Вы можете сворачивать свои данные вручную:

SELECT SUM(CASE WHEN name='bob' THEN points END) as bob,
       SUM(CASE WHEN name='mike' THEN points END) as mike
  FROM score_table

но это не будет работать, если список ваших игроков динамичен.

Ответ 2

В чистом sql:

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

Это аккуратное решение работает из-за того, что mysql booleans оценивает как 1 для true и 0 для false, что позволяет вам умножать истинность теста с числовым столбцом. Я использовал его много раз для "поворота", и мне нравится краткость.

Ответ 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.

Ответ 4

Это называется поворот таблицы:

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

Ответ 5

SELECT sum(points), name
FROM `table`
GROUP BY name

Или для точки опоры

SELECT sum(if(name = 'mike',points,0)),
       sum(if(name = 'bob',points,0))
FROM `table

Ответ 6

вы можете использовать функцию поворота также для одной и той же вещи.. даже по типу производительности лучше использовать поворот для поворота... (я говорю о базе данных оракула)..

вы также можете использовать следующий запрос.  - (если у вас есть только эти два столбца в вашей таблице, тогда будет хорошо видеть вывод 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));