我正在尝试创建一个视图,但是当我包含“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;
答案 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,
如果e
和se
之间存在一对一的关系(看起来很可能),您可以将其保留原样并将se.salary_comm
添加到{{1} @ypercube建议的子句。
答案 1 :(得分:1)
SELECT e.empl_name, si.s_empl_id
...
GROUP BY e.empl_name, si.s_empl_id