SQL - 如何汇总我的计算列

时间:2016-06-29 02:33:13

标签: sql oracle

我正在使用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

结果:

enter image description here

我在寻找:

ID - PROMEDIO
1  - 71.81

3 个答案:

答案 0 :(得分:1)

如果我理解正确,请从quantity子句中删除percentagegroup 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()。虽然您可以将求和包装在整个表达式周围,但这种方法可能通过仅进行除法和乘法来获得数值精度的优势(取决于所涉及的数据类型)。还要注意整数除法,因为我猜测你的三列可能都是整数。