0

我可以访问下表:

    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),但内置函数一次只对一个字段执行此操作,不适用于多个字段/列。

4

3 回答 3

1

要获得多个字段的平均值,您真正要做的是首先找出可以填充字段的方式的组合。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 或一个字段,则您必须首先识别空字段并且不要将它们添加到计算中。例如,如果有两个空字段,那么您的平均值 = 包含值的字段的值。如果两个字段已满,那么您的平均值 = 两个字段之和除以两个等值的值。因此,您要做的是计算该记录中的空字段数,然后从平均字段数中减去空字段数。

于 2013-12-20T01:13:55.973 回答
0

我不知道它的真实代码,但这里有一些伪代码:

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.
于 2013-03-11T07:29:20.467 回答
0

这实际上不是我自己的解决方案,我在这里找到了如何在单行上选择多列的 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 分组的新查询中。

于 2013-03-13T10:53:16.913 回答