【问题标题】:SQL Select with joins and calculate percentageSQL 选择连接并计算百分比
【发布时间】:2020-08-18 05:01:36
【问题描述】:

我有三个表,我正在尝试创建一个 select 语句来给我一个类似下面的结果 团队:

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

【问题讨论】:

  • 你用的是什么sql server,你试过什么?
  • 您到底有什么问题?你想知道什么?你试过什么,你在哪里卡住了?请提出您的问题并告诉我们您面临的问题。

标签: sql join select group-by


【解决方案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

Demo on SQLFiddle

【讨论】:

  • 谢谢,我在上面发表了评论,然后我注意到了你的回复。当我看到您的百分比时,我坚持百分比,并且正在研究它:) 再次感谢
  • @RMohammed 不用担心;您确实需要再次编写 totalgoalshome 的公式来计算百分比,因为您不能在 SELECT 子句中使用别名。
  • @RMohammed 我将您现有的查询添加到您的问题中,希望这将防止它获得更多的反对意见。
  • 非常感谢,如有任何不便,请接受我的歉意
猜你喜欢
  • 2022-01-26
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多