SQL выбирает с помощью соединений и вычисляет процент

#sql #join #select #group-by

#sql #Присоединиться #выберите #группировать по

Вопрос:

У меня есть три таблицы, и я пытаюсь выполнить оператор select, чтобы получить результат, подобный приведенному ниже Teams:

 ID   Name
1     A
2     B
3     C
  

Игроки:

 ID   Name  TeamID
1    P1     1
2    P2     1
3    P3     2
  

Цели: (тип цели: H для дома, A для гостей, T для тренировки)

 ID   PID  goaltype
1    1     A
2    1     A
3    1     H
4    2     A
5    2     H
6    3     A
7    3     T
  

Результат будет выглядеть:

 Team    totalGoals  home    away    trainig      percentage[(home/total)*100]
A       5            2        3        0             40%  
B       2            0        1        1              0
C       0            0        0        0              0
  

Это мой текущий запрос:

 select t.name, 
  count(g.id) as totalGoals, 
  sum(case when g.GTYPE = 'H' then 1 else 0 end) as home, 
  sum(case when g.GTYPE = 'A' then 1 else 0 end) as away, 
  sum(case when g.GTYPE = 'T' then 1 else 0 end) as training,
  --(home/totalGoals) as percentage 
from teams t 
left join players p on p.TeamID = t.id 
left join goals g on g.pid = p.id 
group by t.name
  

Комментарии:

1. Какой sql server вы используете и что вы пробовали?

2. С чем именно у вас проблемы? Что вы хотите знать? Что вы пробовали и где вы застряли? Пожалуйста, покажите свой запрос и расскажите нам, с какой проблемой вы столкнулись.

Ответ №1:

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

 SELECT t.Name AS Team,
       COUNT(g.goaltype) AS totalGoals,
       SUM(CASE WHEN g.goaltype = 'H' THEN 1 ELSE 0 END) AS home,
       SUM(CASE WHEN g.goaltype = 'A' THEN 1 ELSE 0 END) AS away,
       SUM(CASE WHEN g.goaltype = 'T' THEN 1 ELSE 0 END) AS training,
       CASE WHEN COUNT(g.goaltype) = 0 THEN 0
            ELSE 100.0 * SUM(CASE WHEN g.goaltype = 'H' THEN 1 ELSE 0 END) /
                 COUNT(g.goaltype)
       END AS percentage
FROM Teams t
LEFT JOIN Players p ON p.TeamID = t.ID
LEFT JOIN Goals g ON g.PID = p.ID
GROUP BY t.Name
ORDER BY t.Name
  

Вывод:

 team    totalgoals  home    away    training    percentage
A       5           2       3       0           40
B       2           0       1       1           0
C       0           0       0       0           0
  

Демонстрация на SQLFiddle

Комментарии:

1. спасибо, я опубликовал комментарий выше, а затем заметил ваш ответ. Я остановился на процентах и работал над этим, когда увидел ваш 🙂 Еще раз спасибо

2. @RMohammed не беспокойтесь; вам действительно нужно снова написать формулу для totalgoals и home для вычисления процента, поскольку вы не можете использовать псевдонимы в SELECT предложении.

3. @RMohammed Я добавил ваш существующий запрос к вашему вопросу, надеюсь, это предотвратит получение большего количества отрицательных отзывов.

4. большое вам спасибо и примите мои извинения за любые неудобства