这是我的示例数据
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%
答案 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
值在每一行中始终相同 我们可以使用min
,max
来获取计算的单个值。注意 这个计算进行整数除法,就像“舍入”一样 “结果。”如果您的百分比需要小数精度,则需要施放 您的等级和目标值为浮点数或小数:
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