将非修饰符分数乘以修饰符分数 - 访问 SQL

Multiply non-modifier scores by modifier score - Access SQL

我在 MS Access 中有一个 table,其中列出了每个人的 KPI(绩效)分数

USERID  KPI            SCORE  MODIFIER
20511   Productivity   50     False
20511   Cash per Hour  30     False
20511   Quality        0.9    True
21320   Productivity   60     False
21320   Cash per Hour  45     False

将非修饰符 KPI 分数相加并乘以修饰符分数(修饰符标记为真的任何 KPI)

因此,在上面的示例 table 中,用户 20511 的生产力和每小时现金得分总和为 80,然后乘以质量得分 0.9 为 72。

一个额外的问题是并非所有用户都有修饰符,所以在这种情况下我一直使用默认修饰符 1。

到目前为止,我提出了以下查询

SELECT 
[userID], 
sum(IIF(Modifier = 0,([Score]),0)) AS summedScore, 
IIF(sum(iif(Modifier = 1,([Score]),0))=0,1,sum(iif(Modifier = 1,([Score]),0))) as modifierScore, 
summedScore * modifierScore as finalScore
FROM tbl_KPIScores
GROUP BY UserID

这感觉很笨拙,如果修饰符分数实际为 0,也会失败。有更简单的方法吗?

这是最简单情况的解决方案,当每个员工只有一个修改器,或者如果有多个修改器并且您只想随机选择一个(我使用 FIRST() 聚合函数)

SELECT
    T.userID, T.summedScore, Tmod.modif AS modifier, (T.summedScore *  NZ(Tmod.modif,1)) AS finalscore
FROM
(
    SELECT [userID], sum([score]) AS summedScore
    FROM tbl_KPIScores
    WHERE Modifier=False
    GROUP BY UserID
) AS T
LEFT JOIN
(
    SELECT userID, FIRST([score]) AS modif 
    FROM tbl_KPIScores
    WHERE Modifier=True
    GROUP BY UserID
) AS Tmod ON T.userID=Tmod.userID

如果你有多个修饰符,那就变得复杂了。因为你的修饰符是一个系数,所以它应该为每个员工相乘而不是相加。并且 MS Access 没有乘法聚合函数。但是,使用反对数方法可以复制它,但有一些困难。我不会在这里开发这个,因为你还没有回答我对此的评论。 Check this question: Aggregate multiplicate function