通过两个表中的值计算查询中的值

时间:2015-01-10 17:19:06

标签: sql oracle11g inner-join

我有这样的产品表

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

这些是我刚添加的样本数据,仅用于显示样本数据。 我想选择已经完成具有更高价值的订单的前2名私人客户。

我在选择最大售出量的订单时遇到问题。

这就是我要做的事情。

在此我试图获取客户IDS

 SELECT CLIENTS.CLIENT_ID
 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 ( )

在此我试图选择前2个订单

 SELECT TOP 2 ORDERS.ORDER_ID FROM ORDERS
 INNER JOIN ITEMS ON ORDERS.ORDER_ID=ITEMS.ORDER_ID
 INNER JOIN PRODUCTS ON ITEMS.PRODUCT_ID =PRODUCTS.PRODUCT_ID
 WHERE ((PRODUCTS.PACK_PRIZE/PRODUCTS.PACK_SIZE)*(ITEMS.NUMBER_ORDERED));

给我错误 从未找到预期的关键词。

我想要做的是从总数最高且不是来自同一客户的订单中选择订单ID,总计应该通过从pack_size除以pack_price并将number_ordered与项目相乘来查找单价来计算具有匹配订单ID的表。订购的客户应该是公司客户。

我正在使用oracle 11g。

pack_prize是数字pack_size是数字 number_ordered是数字数据类型

2 个答案:

答案 0 :(得分:1)

Oracle不支持top 2。而是使用rownum和子查询:

WITH CTE as (
      SELECT ORDERS.ORDER_ID, PRODUCTS.PACK_PRIZE, PRODUCTS.PACK_SIZE, ITEMS.NUMBER_ORDERED
      FROM ORDERS INNER JOIN
           ITEMS
           ON ORDERS.ORDER_ID = ITEMS.ORDER_ID INNER JOIN
           PRODUCTS
           ON ITEMS.PRODUCT_ID = PRODUCTS.PRODUCT_ID
     )
SELECT ORDER_ID
FROM (SELECT CTE.*
      FROM CTE
      ORDER BY (PACK_PRIZE/PACK_SIZE) * NUMBER_ORDERED DESC
     ) t
WHERE rownum <= 2;

我猜测奇怪的where表达式就是你用来确定最佳行的方法。

答案 1 :(得分:0)

TOP在oracle中不起作用。您可以使用虚拟列ROWNUM或函数ROW_NUMBER()OVER()来获得类似的功能。