按分数动态标记用户

时间:2010-02-04 09:56:38

标签: sql ms-access

我有一张桌子上有用户及其得分,十进制数字为1 - 10。 表(user_id,得分)我还有1行查询,得分平均值(约6)和标准差(约0.5)。我使用MS Access 2007。

我想标记用户A,B,C,D,其中:

  • A得分高于(avg + stdev);
  • B的分数低于A,但高于平均分;
  • C的分数低于平均分,但高于(avg-stdev)
  • D的分数低于(avg-stdev)。

如果我将所有数据导出到Excel,我可以轻松地计算这些值,并将它们导回到数据库中。显然,这不是最优雅的方式。我想用SQL作为查询来做这件事。结果应该是表(user_id,label)

但是怎么样?

2 个答案:

答案 0 :(得分:2)

您可以使用交叉联接将用户加入到1行统计信息查询中。然后你可以使用嵌套的iif来计算成绩。

像这样......

SELECT  users.*,grade.*
,iif(users.score>grade.high,"A",iif(users.score>grade.average,"B",iif(users.score>grade.low,"C","D"))) as label
FROM (SELECT round(avg(users.score)-stdev(users.score),1) as low
,round(avg(users.score),1) as average
,round(avg(users.score)+stdev(users.score),1) as high
FROM users)  AS grade, users;

答案 1 :(得分:0)

IIF成功了。

我采用了平均分数的查询来添加最小的A,B和C分数

Table(avg,stdev,Ascore,Bscore,Cscore) as averages

最终查询看起来像

SELECT user.Id, user.avgScore, 
IIf(avgScore>averages.Ascore,"A",
 IIf(avgScore>averages.Bscore,"B",
  IIf(avgScore>averages.Cscore,"C","D"))) AS label
FROM averages, users