【问题标题】:Correlated Subquery and Arithmetic in Oracle SQLOracle SQL 中的相关子查询和算术
【发布时间】:2020-02-06 16:37:56
【问题描述】:

这是我第二次发帖,我从第一次发帖中得到了很多关于一些困难的良好反馈。我正在努力提高我的 SQL 技能并构建此查询,但我不知道如何处理

* 我设法纠正了我的问题中的所有原始错误,但还有最后一个疑问 *

select wo.si_number,ivh.total_cost, wo.bill_name,pnm.pn, pnm.description, woqh.approved_date,ivh.total_price,
(select sum(ivh.total_price - ivh.total_cost) / nullif(ivh.total_price,0) from invc_header ivh where wqh_auto_key = wqh.wqh_auto_key group by ivh.total_price) as CTP,
ivh.post_date, wwt.description, wqh.WQH_AUTO_KEY, wqh.POST_DESC
from wo_operation wo, parts_master pnm,wo_quote_header wqh, 
wo_quote_detail wqd, invc_header ivh, wo_work_type wwt, wo_quote_header woqh
where wo.pnm_auto_key = pnm.pnm_auto_key
and wo.woo_auto_key = wqd.woo_ref
and wqd.wqh_auto_key = wqh.wqh_auto_key
and wqh.WQH_NUMBER = woqh.WQH_NUMBER
and ivh.wqh_auto_key (+)= wqh.wqh_auto_key
and wwt.wwt_auto_key (+)= wo.wwt_auto_key
and wo_type = 'External'
and wqh.POST_DESC is not NULL
and woqh.approved_date between to_date('01/01/2020', 'MM/DD/YYYY') and to_date('01/31/2020', 'MM/DD/YYYY')
order by ctp

我不确定如何让脚本只提取 ctp

【问题讨论】:

  • @CoderLee 嘿李!我尝试在几个不同的地方添加它,但我收到“无效标识符”错误。由于它源于子查询,我不确定将其放置在哪里
  • 该子查询在运行时返回什么样的值,您使用的是 PL/SQL T-SQL 还是其他?
  • @CoderLee 返回的值是小数,所以我猜它会
  • 我不知道为什么 Oracle 会在比较操作中抛出一个标识符错误,但也许可以尝试 AND CPT
  • @CoderLee 我相信这与 CTP 是基于子查询生成的字段有关。我认为我不能在外部查询中引用别名。

标签: sql subquery correlated-subquery


【解决方案1】:

只要您的 CTP 列是一个数字,您就可以将其添加到您的 WHERE 中,如下所示,我将它添加到查询的 WHERE 子句的末尾。

SELECT wo.si_number, 
       ivh.total_cost, 
       wo.bill_name, 
       pnm.pn, 
       pnm.description, 
       woqh.approved_date, 
       ivh.total_price, 
(
    SELECT SUM(ivh.total_price - ivh.total_cost) / NULLIF(ivh.total_price, 0)
    FROM invc_header ivh
    WHERE wqh_auto_key = wqh.wqh_auto_key
    GROUP BY ivh.total_price
) AS CTP, 
       ivh.post_date, 
       wwt.description, 
       wqh.WQH_AUTO_KEY, 
       wqh.POST_DESC
FROM wo_operation wo, 
     parts_master pnm, 
     wo_quote_header wqh, 
     wo_quote_detail wqd, 
     invc_header ivh, 
     wo_work_type wwt, 
     wo_quote_header woqh
WHERE wo.pnm_auto_key = pnm.pnm_auto_key
      AND wo.woo_auto_key = wqd.woo_ref
      AND wqd.wqh_auto_key = wqh.wqh_auto_key
      AND wqh.WQH_NUMBER = woqh.WQH_NUMBER
      AND ivh.wqh_auto_key (+)= wqh.wqh_auto_key
      AND wwt.wwt_auto_key (+)= wo.wwt_auto_key
      AND wo_type = 'External'
      AND wqh.POST_DESC IS NOT NULL
      AND woqh.approved_date BETWEEN to_date('01/01/2020', 'MM/DD/YYYY') AND to_date('01/31/2020', 'MM/DD/YYYY')
      AND CTP <= 30
ORDER BY ctp;

一个简单的小于或等于操作会将您的结果过滤到所需的范围内,因此您只能根据要求获得小于 30 的结果。此外,如果您需要 29 岁及以下,您可以省略 =

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多