SQL单组组功能错误/不是分组表达式

时间:2013-11-17 06:09:49

标签: sql oracle count group-by

我正在尝试创建一个视图,但是当我包含“group by”函数时,它表示第2行有一个错误,表示它不是group-by表达式。 如果我注释掉“分组依据”功能,那么它会在视图中显示单组组功能错误。 我该如何解决这个问题?

CREATE or REPLACE VIEW bestseller_view
  AS SELECT e.empl_name,
            NVL((sum((si.amt_paid+a.ao_price)-fs.purchase_cost+a.ao_purchase_price)*se.salary_comm),0) sales_commission,
            COUNT(si.s_empl_id) vehicles_sold
 FROM for_sale fs
 JOIN sales_invoice si ON fs.vehicle_id = si.vehicle_id
 JOIN sales_empl se    ON si.s_empl_id = se.empl_id
 JOIN purchased_ao pao ON si.sales_invoice_id=pao.sales_invoice_id
 JOIN add_ons a        ON pao.ao_id=a.ao_id
 JOIN employee e       ON se.empl_id=e.empl_id;
 GROUP BY si.s_empl_id;

2 个答案:

答案 0 :(得分:2)

select中的非汇总列为e.empl_name,因此您需要对其进行分组,而不是si.s_empl_id;

... SELECT e.empl_name,
  NVL((sum(...),0) sales_commission,
  COUNT(...) vehicles_sold
...
GROUP BY e.empl_name;

但由于empl_name可能不保证是唯一的,因此通过ID进行分组更有意义。您需要选择并按两列分组 - 尽管使用e.empl_id可能看起来更合乎逻辑 - 如果它不相关则忽略您获得的ID,在这种情况下,只是从不从视图中选择它;或者将其用作内部查询,不要将其包含在外部查询中。看起来更有意义的是将它放在视图中,以防有一天有人想要/需要它。

... SELECT e.empl_id, e.empl_name,
  NVL((sum(...),0) sales_commission,
  COUNT(...) vehicles_sold
...
GROUP BY e.empl_id, e.empl_name;

您的括号也在sum

的错误位置
NVL((sum((si.amt_paid+a.ao_price)-fs.purchase_cost+a.ao_purchase_price)
     *se.salary_comm),0) sales_commission,

...正在计算所有(si.amt_paid+a.ao_price)-fs.purchase_cost+a.ao_purchase_price值的总和,然后将该总和乘以se.salary_comm,这使得该列也是非聚合的;我很确定这不是你的意思,所以应该是:

NVL(sum((si.amt_paid+a.ao_price-fs.purchase_cost+a.ao_purchase_price)
  *se.salary_comm),0) sales_commission,

如果ese之间存在一对一的关系(看起来很可能),您可以将其保留原样并将se.salary_comm添加到{{1} @ypercube建议的子句。

答案 1 :(得分:1)

 SELECT e.empl_name, si.s_empl_id
 ...
 GROUP BY e.empl_name, si.s_empl_id