Выберите несколько сумм с запросом 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));