【问题标题】:Calculate value in the query by values from two tables通过两个表中的值计算查询中的值
【发布时间】:2015-01-10 17:19:06
【问题描述】:

我有这样的产品表

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

项目表

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));

给我错误 FROM 在预期的地方找不到关键字。

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

我正在使用 oracle 11g。

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

【问题讨论】:

    标签: sql oracle11g inner-join


    【解决方案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 表达式是您用来确定最佳行的。

    【讨论】:

    • 它给了我错误 sqlcommand 没有正确结束。还有一件事,如何将其与我的第一个查询联系起来。你能在没有 CTE 的情况下给我一个答案吗,因为我是 CTE 的新手,这让现场有点复杂。
    • @chathwind,cte 比子查询可读。它就像子查询一样。添加了缺少的括号。要获取客户端 ID,请加入 cte 中的客户端表
    • @GordonLinoff 它仍然给出未正确结束的错误。 :(
    • @radar 还有一件事,从 cte 选择的 2 个订单应该来自企业客户。如何做到这一点?你能告诉我如何加入 cte 吗?
    【解决方案2】:

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

    【讨论】:

    • 除此之外你能找到我的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多