SQL - 如何计算每个团队的三个不同百分比

时间:2017-07-02 07:57:56

标签: sql database

这是我的示例数据

CREATE TABLE Grades
([Team] varchar(10),[Grade] Integer, [Target] Integer);

INSERT INTo Grades VALUES ('A',26,25);
INSERT INTo Grades VALUES ('A',13,35);
INSERT INTo Grades VALUES ('A',13,15);
INSERT INTO Grades VALUES ('B',10,20);
INSERT INTo Grades VALUES ('B',13,11);
INSERT INTO Grades VALUES ('C',20,30);

这是我失败的尝试

   Select Team, 
    (count(case when Grade >= Target then Target else Grade end) * 100 /  

    (SELECT count(Target) FROM Grades)) As Target
    From Grades
    GROUP BY Team

问题 - 我可以将其作为一个整体的百分比来做,但我正在努力将这些百分比区分为他们自己的团队。

我认为GROUP BY可以拆分它们,但是SQL查询仍然对整个列进行求和,这就是我对SQL的理解在做什么范围内的限制。

解释

每个插入的记录都有一个等级和目标,等级可以超过目标,如果是,它会使用目标值来防止百分比超过100时全部聚合。

例如

B队,等级为10,低于目标20.在这种情况下,我们使用10并将其加到总数中。接下来,我们有另一行属于B队,它是13,但它超过目标11.我们现在将使用11而不是13,因为13级超过了目标11。

现在我们需要B队的一个百分比。我们将等级的值加起来,我们这样说,等级是21,而不是23.然后我们将21除以31(B队的总目标)。这给了我们0.677%

2 个答案:

答案 0 :(得分:1)

根据原始问题的新信息,我将改进我的答案:

select Team,cast(Sum(case when Grade>[Target] then [Target] else Grade end) as float)*100/SUM([Target]) from Grades
group by Team

我将在下面保留原始答案以获取更多信息。

  

这将完成这项工作:

select Team,Sum([Grade])*100/Count([Grade])/Max([Target]) from Grades
group by Team
     

由于团队的Target值在每一行中始终相同   我们可以使用minmax来获取计算的单个值。注意   这个计算进行整数除法,就像“舍入”一样   “结果。”

     

如果您的百分比需要小数精度,则需要施放   您的等级和目标值为浮点数或小数:

select Team,cast(Sum([Grade]) as float)*100/Count([Grade])/Max([Target]) from Grades
group by Team
     

最后,如果您需要最终舍入值,请使用Round函数   最终的计算值,如round(cast(Sum(Grade) as float)*100/Count(Grade)/Max([Target]),0)

答案 1 :(得分:1)

好的,我想我现在理解你的计算了 您关闭但由于某种原因您使用了count而不是sum 我想出了这个问题:

SELECT  [Team],
        SUM(CASE WHEN [Grade] > [Target] THEN [Target] ELSE [Grade] END) * 100 /
        SUM([Target]) As [Target]
FROM Grades
GROUP BY [Team]

这给了我你提供的样本数据的结果。

Team    Target
A       68
B       67
C       66