代码之家  ›  专栏  ›  技术社区  ›  Gerrit

按分数动态标记用户

  •  0
  • Gerrit  · 技术社区  · 14 年前

    我有一张用户表和他们的分数,一个1-10的十进制数字。 表(user_id,score)我也有一个1行查询,平均得分(约6分)和标准差(约0.5分)。我使用MS Access 2007。

    我想给用户A、B、C、D加上标签,其中:

    • a得分高于(avg+stdev);
    • B的得分低于A,但高于平均分;
    • C的得分低于平均分,但高于(平均标准差)
    • D的得分低于(平均标准偏差)。

    如果我将所有数据导出到Excel,我就可以轻松地计算这些值,并将它们导入到数据库中。显然,这不是最优雅的方式。我想将SQL作为一个查询来实现这一点。结果应该是一个表(用户ID,标签)

    但是如何呢?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Craig    14 年前

    可以使用交叉联接将用户联接到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;
    
        2
  •  0
  •   Gerrit    14 年前

    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