SQL-запрос для группировки записей по отдельным полям - PullRequest
2 голосов
/ 14 апреля 2011

Я работаю с MySQL, и у меня есть следующая схема:

id school          round score win loss tie
2  My School Name  1     10    1   0    0
3  My School Name  2     20    0   1    0
4  My School Name  3     30    1   0    0
5  My School Name  4     40    1   0    0
6  My School Name  5     50    1   0    0
7  My School Name  6     60    0   0    1

И мне нужен следующий вывод, сгруппированный по названию школы

School         Round1 Round2 Round3 Round4 Round5 Round6 wins losses ties
My School Name 10     20     30     40     50     60     4    1      1

Пока я чувствую, что могу использовать GROUP BY School и SUM(win) as wins, чтобы извлечь из него большую часть функциональности. Однако сложнее всего получить эти Round_ поля.

Кто-нибудь знает, как это сделать? Заранее спасибо, любая помощь будет высоко ценится!

Редактировать: чтобы уточнить, я знаю, что у меня точно 10 раундов.

Ответы [ 3 ]

1 голос
/ 14 апреля 2011

Мы можем использовать оператор SELECT для школы GROUP BY, чтобы создать запись для каждой школы. Как вы заметили, столбцы связей, выигрышей и проигрышей легко рассчитываются с помощью агрегатной функции SUM. Чтобы нацелиться на определенный раунд, мы можем использовать некоторую умную математику (чтобы избежать многословных условных выражений, подобных предложенному CodeByMoonlight):

Если мы хотим нацелиться на раунд R, отметим, что «раунд-R» равен 0 только тогда, когда раунд == R, в противном случае он не равен 0. Когда мы принимаем NOT для «раунд-R», 0 инвертируется в 1, в то время как все остальное установлено в 0. Теперь, если мы умножим! (раунд-R) на результат этого раунда, это даст нам 0, когда раунд не R (так как 0 * оценка = 0), и это даст нам «счет», когда раунд R (как 1 * оценка = оценка). Затем, когда мы берем СУММУ этого значения по столбцам, мы добавляем счет, когда раунд = R и 0 в противном случае, фактически давая нам только раунд R счет.

Если сложить все вместе, то получим:

SELECT school AS `School`,
SUM(!(round-1)*score) AS `Round1`,
SUM(!(round-2)*score) AS `Round2`,
SUM(!(round-3)*score) AS `Round3`,
SUM(!(round-4)*score) AS `Round4`,
SUM(!(round-5)*score) AS `Round5`,
SUM(!(round-6)*score) AS `Round6`,
SUM(!(round-7)*score) AS `Round7`,
SUM(!(round-8)*score) AS `Round8`,
SUM(!(round-9)*score) AS `Round9`,
SUM(!(round-10)*score) AS `Round10`,
SUM(win) AS `wins`,
SUM(loss) AS `losses`,
SUM(tie) AS `ties`
FROM `RoundScores` GROUP BY `school`

где RoundScores - рассматриваемая таблица.

EDIT:

Если мы не хотим вручную добавлять 10, мы можем использовать подготовленные операторы :

# Store all the conditionals in a string:
#   I was not able to to have round loop from 1 to 10, so I iterated over
#   all distinct values of 'round' present in the table.
SET @s =  "";
SELECT `round`, (@s := CONCAT( @s ,  "SUM(!(round-",round,  ")*score) AS `Round",round,  "`," )) FROM `RoundScores` GROUP BY `round`;

# Combine the conditionals from before with the rest of the statement needed.
SET @qry = CONCAT("SELECT school AS `School`,",@s,"SUM(win) AS `wins`,SUM(loss) AS `losses` FROM `RoundScores` GROUP BY `school`");

# Prepare and execute the statement.
PREPARE stmt1 FROM @qry;
EXECUTE stmt1;
0 голосов
/ 14 апреля 2011
SELECT School, Sum(Case
    When Round = 1 Then Score
    Else 0
End) AS Round1, Sum(Case
    When Round = 2 Then Score
    Else 0
End) AS Round2, Sum(Case
    When Round = 3 Then Score
    Else 0
End) AS Round3, Sum(Case
    When Round = 4 Then Score
    Else 0
End) AS Round4, Sum(Case
    When Round = 5 Then Score
    Else 0
End) AS Round5, Sum(Case
    When Round = 6 Then Score
    Else 0
End) AS Round6, Sum(Case
    When Round = 7 Then Score
    Else 0
End) AS Round7, Sum(Case
    When Round = 8 Then Score
    Else 0
End) AS Round8, Sum(Case
    When Round = 9 Then Score
    Else 0
End) AS Round9, Sum(Case
    When Round = 10 Then Score
    Else 0
End) AS Round10, Sum(Wins) AS Wins, Sum(Losses) AS Losses, Sum(Ties) AS Ties
FROM MyTable
GROUP BY School

Должно работать:)

0 голосов
/ 14 апреля 2011

ПОПРОБУЙТЕ С СОЮЗ (не проверено)

   SELECT SUM(win) AS wins, SUM(loss) AS losses, SUM(tie) AS ties
   FROM table 
   GROUP BY (school)

   UNION

   SELECT score AS round1 FROM table WHERE round=1

   UNION

   SELECT score AS round2 FROM table WHERE round=2
.... AND so on..
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...