Nested query missing expression

时间:2016-12-09 13:08:07

标签: sql oracle nested rownum

SELECT customer_id, company_code
FROM customer, commercial_cust
WHERE commercial_cust.FK_customer_id = customer.customer_id
(
SELECT payment_method, payment_date
FROM payment, cust_order
WHERE payment_link.FK_order_id = cust_order.order_id
(
SELECT order_id, payment_date, SUM(payment_ammount) payment_ammount
FROM cust_order, payment_link, payment
WHERE cust_order.FK_customer_id = customer.customer_id AND payment_link.FK_payment_id = payment.payment_id
)
GROUP BY payment_ammount.DESC
)
WHERE ROWNUM <=(SELECT COUNT(*) FROM cust_order)/4;

For a database assignment I have been asked to display a list of 25% more lucrative commercial customers. I have written this out but I keep getting a missing element error and I'm not sure where I am meant to put the semicolon (if it is the semicolon). I've tried moving it around and removing parts of the script but it doesn't seem to be working.

This will be hugely appreciated if somebody can help. The rest of the code is correct in terms of names etc.

2 个答案:

答案 0 :(得分:1)

您应该已经显示了您的表包含的内容,它们之间的关系,并且应该已经提供了样本数据和预期结果。所以我的答案可能完全不符合您的要求。

让我们简单看看客户订购了多少:将每位客户的订单金额相加,确保客户是“商业客户”,并将结果划分为4个区块,只保留第一个(即排名最高的)区块。

select customer_id, sum_amount
from
(
  select 
    fk_customer_id as customer_id, 
    sum(order_amount) as sum_amount, 
    ntile(4) over (order by sum(order_amount) desc) as block
  from cust_order
  where fk_customer_id in (select fk_customer_id from commercial_cust)
  group by fk_customer_id
)
where block = 1
order by sum_amount desc;

如果您想使用付款,请执行相同操作,但将付款加入订单并使用该金额:

select customer_id, sum_amount
from
(
  select 
    o.fk_customer_id as customer_id, 
    sum(p.payment_ammount) as sum_amount, 
    ntile(4) over (order by sum(p.payment_ammount) desc) as block
  from cust_order co
  join payment_link pl on pl.fk_order_id = o.order_id
  join payment p on p.payment_id = pl.fk_payment_id
  where o.fk_customer_id in (select fk_customer_id from commercial_cust)
  group by o.fk_customer_id
)
where block = 1
order by sum_amount desc;

答案 1 :(得分:0)

尝试使用此查询,您会遇到很多语义和语法错误:

SELECT customer_id, company_code, payment, cust_order, order_id, payment_date, SUM(payment_ammount) payment_ammount
FROM customer, commercial_cust, cust_order, payment_link, payment
WHERE commercial_cust.FK_customer_id = customer.customer_id
AND payment_link.FK_order_id = cust_order.order_id
AND cust_order.FK_customer_id = customer.customer_id AND payment_link.FK_payment_id = payment.payment_id
GROUP BY payment_ammount.DESC
HAVING ROWNUM <=(SELECT COUNT(*) FROM cust_order)/4;