Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-如何为每个团队计算三个不同的百分比_Sql_Database - Fatal编程技术网

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,以便计算平均分数(假设目标始终相同)。“但你是对的,对于你真正的问题,这是一条路要走。”佐哈尔·佩利德非常感谢你!是的,奇怪的是,我以前试过求和,但它给了我错误的数字。现在,它正在生成正确的数字。(非常奇怪的服务器)很乐意帮忙:-)