SQL-如何为每个团队计算三个不同的百分比
这是我的样本数据SQL-如何为每个团队计算三个不同的百分比,sql,database,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 I
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
问题-我可以作为一个整体的百分比来做,但我正在努力如何将这些百分比区分为他们自己的团队
我原以为GROUPBY可以将它们分开,但SQL查询仍然对整个列进行求和,这就是我对SQL的理解在操作范围上受到限制的地方
解释
插入的每个记录都有一个等级和目标,等级可以超过目标值,如果超过目标值,则使用目标值来防止在汇总时百分比超过100
比如说
B队成绩为10分,低于目标20分。在本例中,我们使用10并将其添加到总数中。但接下来,我们有另一排属于B队,是13排,但超过了目标11排。我们现在将使用11而不是13,因为等级13超过了目标11
现在我们需要一个B组的百分比。我们把等级的值加起来,我们说等级是21,而不是23。然后我们将21除以31(团队B的总目标)。这给了我们0.677%根据原始问题的新信息,我将对我的答案进行如下改进:
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
因为团队的目标
值在每行中始终相同
我们可以使用min
,max
来获得计算的单个值。注
这个计算是整数除法,类似于“舍入”
把结果记下来
如果您需要百分比中的小数精度,则需要强制转换
将分数和目标值设置为浮点或十进制:
select Team,cast(Sum([Grade]) as float)*100/Count([Grade])/Max([Target]) from Grades
group by Team
最后,如果您需要一个最终的舍入值,只需使用上的Round
函数即可
最终计算值,如round(cast)(总和(等级))为
浮动)*100/计数(等级)/最大值([目标]),0)
好的,我想我现在明白你的计算了。
您在哪里关闭,但出于某种原因,您使用了
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
你能解释一下你试图做的计算吗?@Zoharpeld嗨,Zohar,我已经提供了一个解释和一个例子来帮助你理解场景和背景。我希望这有助于Shi TSungar,你的答案很好,但我认为我的数据集缺乏多样性,所以跳过了一步。不幸的是,我对每个团队的目标价值并不总是相同的。如果是这样的话,您的SQL查询对于我的问题将是完美的。(我编辑了我的原始帖子,以帮助进一步解释这一点)可能是这样的:选择团队,将(Sum(当成绩>[Target]然后[Target]否则成绩结束时)转换为float)*100/总和([Target])我仍然会保存你的答案,因为它肯定对我有限的知识有所帮助,所以我感谢你的答案和为此付出的努力。在我之前的尝试中,我使用了count,以便计算平均分数(假设目标始终相同)。“但你是对的,对于你真正的问题,这是一条路要走。”佐哈尔·佩利德非常感谢你!是的,奇怪的是,我以前试过求和,但它给了我错误的数字。现在,它正在生成正确的数字。(非常奇怪的服务器)很乐意帮忙:-)