获取两个表的两列乘法的总和

时间:2015-01-10 19:56:33

标签: sql oracle oracle11g top-n

我有这样的产品表

PRODUCT_ID  PACK_SIZE   PACK_PRIZE
 3000           5       2.5
 3001           5       2.5
 3002           5       2.5
 3003           5       2.5

订单表

order_id     client_id 
75001   1024
75002   1033
75003   1030

ITEMS表

ORDER_ID    PRODUCT_ID  NUMBER_ORDERED
 75001  3936    2
 75001  3557    5
 75001  3012    3
 75001  3236    4

客户表

CLIENT_ID   LAST_NAME    STATUS
 1021    Smith          private
 1022    Williams       corporate
 1023    Browne         private
 1024    Tinsell        corporate

这些是我刚添加的样本数据,仅用于显示样本数据。 在这里,我想选择总订单金额最高的前5位客户。

我想选择状态为公司且订单数量最多的客户。

换句话说,我想选择总订单金额较高的客户的client_id。

在这里,我试图像这样实现它。

   WITH CTE as ( SELECT ORDERS.ORDER_ID, PRODUCTS.PACK_PRIZE, PRODUCTS.PACK_SIZE,    ITEMS.NUMBER_ORDERED,
  CLIENTS.STATUS,CLIENTS.CLIENT_ID,CLIENTS.FIRST_NAME,CLIENTS.LAST_NAME
   FROM ORDERS INNER JOIN
       ITEMS
       ON ORDERS.ORDER_ID = ITEMS.ORDER_ID INNER JOIN
       PRODUCTS
       ON ITEMS.PRODUCT_ID = PRODUCTS.PRODUCT_ID
       INNER JOIN
       CLIENTS
       ON ORDERS.CLIENT_ID = CLIENTS.CLIENT_ID
       WHERE CLIENTS.STATUS='corporate')
SELECT CLIENT_ID,FIRST_NAME,LAST_NAME,ORDER_ID,((PACK_PRIZE/PACK_SIZE) * NUMBER_ORDERED)AS Total
FROM (SELECT CTE.*
  FROM CTE
  ORDER BY SUM(PACK_PRIZE/PACK_SIZE) * NUMBER_ORDERED DESC
 ) t
 WHERE rownum <= 5;

但在这里,我获得了最高订单,所以同一客户的订单也是如此。

我想选择总订单金额最高的前5位客户。

应选择所有公司客户。 然后应计算每个客户的所有订单的总金额 我想选择具有最高10个值的客户端。 我使用的是oracle 11g。

1 个答案:

答案 0 :(得分:1)

只需使用类似的东西,并根据您的特殊需要进行调整。这里没有更复杂的必要。你会明白的。

您需要的只是聚合函数。请参阅documentation

select * from (
SELECT customer_id, sum(number_ordered*(pack_prize/pack_size) as totalvalue
FROM customers 
natural join orders 
natural join items 
natural join products 
group by customer_id order by totalvalue desc
) WHERE rownum <= 5;