我正在使用Oracle,我正在尝试总结我的计算列,但我不知道如何
SELECT a.ID, a.grade_code,
ROUND((sum(a.grade)/b.quantity)*b.percentage/100,2) as promedio
FROM grade a
INNER JOIN distri_grade b
ON b.grade_code = a.grade_code
group by a.ID, a.grade_code, b.quantity, b.percentage
order by a.ID, a.grade_code
结果:
我在寻找:
ID - PROMEDIO
1 - 71.81
答案 0 :(得分:1)
如果我理解正确,请从quantity
子句中删除percentage
和group by
字段。还要在整个sum
子句周围添加括号:
SELECT a.ID, a.grade_code,
round(sum((a.grade/b.quantity)*(b.percentage/100)),2) as promedio
FROM grade a
INNER JOIN distri_grade b
ON b.grade_code = a.grade_code
group by a.ID, a.grade_code
order by a.ID, a.grade_code
答案 1 :(得分:1)
这将是这样的:
SELECT g.ID,
ROUND(sum( (g.grade / dg.quantity) * dg.percentage / 100), 2) as promedio
FROM grade g INNER JOIN
distri_grade dg
ON dg.grade_code = g.grade_code
group by g.ID
order by g.ID;
如果您想要每ID
行一行,那么这是GROUP BY
中唯一的列。我正在猜测你正在寻找的公式是什么。在任何情况下,使用的所有列都需要是聚合函数sum()
的参数。
注意:作为表名缩写的表别名更容易阅读。
答案 2 :(得分:0)
我的印象是你想要这个:
SELECT
a.ID,
ROUND( sum(a.grade) / min(b.quantity) * min(b.percentage) / 100, 2 ) as promedio
FROM grade a INNER JOIN distri_grade b ON b.grade_code = a.grade_code
group by a.ID
在您尝试的内容中,distri_grade
(又名b
)的所有值对于附加到单个ID
的所有行都是固定的。当这些是常数时,sum(a.grade / QUANTITY * PERCENTAGE) = sum(a.grade) / QUANTITY * PERCENTAGE
代数是真的,因为乘法的加性的分布特性。在SQL中,提取这些"常量"组上的值是使用虚拟聚合,如min()
或max()
。虽然您可以将求和包装在整个表达式周围,但这种方法可能通过仅进行除法和乘法来获得数值精度的优势(取决于所涉及的数据类型)。还要注意整数除法,因为我猜测你的三列可能都是整数。