我可以访问下表:
entity ratingA ratingB ratingC
XYZ 0-100 0-100 0-100
ABC 0-100 0-100 0-100
我需要查询以从每个实体的每 3 列(字段:ratingA、ratingB、ratingC)中执行一些简单的聚合函数(SUM、MAX、AVE),但内置函数一次只对一个字段执行此操作,不适用于多个字段/列。
我可以访问下表:
entity ratingA ratingB ratingC
XYZ 0-100 0-100 0-100
ABC 0-100 0-100 0-100
我需要查询以从每个实体的每 3 列(字段:ratingA、ratingB、ratingC)中执行一些简单的聚合函数(SUM、MAX、AVE),但内置函数一次只对一个字段执行此操作,不适用于多个字段/列。
要获得多个字段的平均值,您真正要做的是首先找出可以填充字段的方式的组合。ex 3 个字段可以用 8 种方式填写 1,0,0 - 0,1,0, - 0,0,1 - 1,1,0 - 1,0,1 - 0,1,1 - 1,1,1 - 0,0,0 其中 0 表示空字段,如果所有字段都已填充,您可以强制和参数对字段求和并除以 3,但是如果仅填充 2 或一个字段,则您必须首先识别空字段并且不要将它们添加到计算中。例如,如果有两个空字段,那么您的平均值 = 包含值的字段的值。如果两个字段已满,那么您的平均值 = 两个字段之和除以两个等值的值。因此,您要做的是计算该记录中的空字段数,然后从平均字段数中减去空字段数。
我不知道它的真实代码,但这里有一些伪代码:
SELECT RatingA+RatingB+RatingC/3 AS average
WHERE entity = XYZ
对所有实体进行分组:
SELECT RatingA+RatingB+RatingC/3 AS average
GROUP BY entity
更好的是:
TABLE
ENTITY VALUE RATINGTYPE
XYZ 7 A
XYZ 3 B
XYZ 5 C
ABC 4 A
ABC 4 D
如果您计划在未来扩展,那么您将拥有无限数量的类型。
SELECT rating/count(rating) AS average
WHERE entity = XYZ
(AND TYPE = A) #If you want to sort by only one type.
这实际上不是我自己的解决方案,我在这里找到了如何在单行上选择多列的 AVG,类似于 mysql 并采用它进行访问(因为没有函数 ISNULL):
(NZ(RatingA, 0) + NZ(RatingB, 0) + NZ(RatingC, 0)) /
(IIF(ISNULL(RatingA), 0, 1) + IIF(ISNULL(RatingB), 0, 1) + IIF(ISNULL(RatingC), 0, 1))
我把它作为一个计算字段放在按字段 ENTITY 分组的新查询中。