Выберите несколько сумм с запросом MySQL и отобразите их в отдельных столбцах - PullRequest
12 голосов
/ 21 июня 2011

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

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 ]

18 голосов
/ 21 июня 2011

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

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

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

7 голосов
/ 21 июня 2011

В чистом виде:

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

Это аккуратное решение работает благодаря тому, что логические значения mysql оцениваются как 1 для true и 0 для false, что позволяет вам умножить истинность теста на числовой столбец. Я использовал это много раз для «опорных точек», и мне нравится краткость.

3 голосов
/ 21 июня 2011

Все ли имена игроков известны заранее? Если это так, вы можете сделать:

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-результат.

2 голосов
/ 21 июня 2011

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

SELECT SUM(IF(name = "Bob", points, 0)) AS points_bob,
       SUM(IF(name = "Mike", points, 0)) AS points_mike
FROM score_table
1 голос
/ 21 июня 2011
SELECT sum(points), name
FROM `table`
GROUP BY name

Или для оси

SELECT sum(if(name = 'mike',points,0)),
       sum(if(name = 'bob',points,0))
FROM `table
0 голосов
/ 21 июня 2011

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

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

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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...