我有这样的产品表
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是数字数据类型
答案 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()来获得类似的功能。