在 ORACLE SQL 中组合两个 SQL 查询以给出两个列

Posted

技术标签:

【中文标题】在 ORACLE SQL 中组合两个 SQL 查询以给出两个列【英文标题】:COMBINE TWO SQL QUERY TO GIVE TWO COLUMNS- IN ORACLE SQL 【发布时间】:2021-11-30 06:31:16 【问题描述】:

我需要将两组不同的查询合并到两个不同的列中。

持续时间

select 
  sum(duration),
  pps.person_id
from 
    anc_per_abs_entries apae,
    anc_absence_types_vl abs,
    per_periods_of_service pps,
    anc_absence_type_reasons_f abtype,
    anc_absence_reasons_f_tl ab_reason

where 1=1
  AND (To_Char(apae.start_date  ,'YYYY-MM-DD') Between to_date(To_Char(:From_Date,'YYYY-MM-DD'),'YYYY-MM-DD') And to_date(To_Char(:To_Date,'YYYY-MM-DD'),'YYYY-MM-DD') )
  AND apae.APPROVAL_STATUS_CD = 'APPROVED'
  AND apae.ABSENCE_STATUS_CD = 'SUBMITTED'
  and abs.name like  'Paid Personal Leave' 
  AND apae.period_of_service_id = pps.period_of_service_id
  AND apae.absence_type_id = abs.absence_type_id
  AND abtype.absence_type_id = abs.absence_type_id
  AND ab_reason.absence_reason_id = abtype.absence_reason_id
  AND apae.absence_type_reason_id = abtype.absence_type_reason_id
  AND pps.person_id = papf.person_id  
group by pps.person_id

测量

select sum(measure)
from
    time_track rec ,
    time_type rec_type,
    per_all_people_f papf
where 1=1
  AND rec_type.tm_bldg_blk_version = rec.tm_rec_version
  AND rec.tm_rec_type IN ( 'RANGE', 'MEASURE' )
  AND (to_date(To_Char(rec.START_TIME,'YYYY-MM-DD'),'YYYY-MM-DD') Between to_date(To_Char(:From_Date,'YYYY-MM-DD'),'YYYY-MM-DD') And to_date(To_Char(:To_Date,'YYYY-MM-DD'),'YYYY-MM-DD') )
  and papf.person_id = rec.person_id

from_date 和 to_date 是参数,这两个查询应该形成我的结果集的两个不同列。我的预期结果是 -

person_number                      duration                                 measure
73636                               10                                       8

即持续时间来自查询 1,测量来自查询 2。如果我在一个查询中用作 2 个子查询,这两个查询需要计算并且会受到影响或被操纵。 例如,因为带薪事假的持续时间为 2020 年 1 月 1 日,但它没有“度量”,但仍会出现在结果输出中。

如何将这两者结合起来,在两个不同的列中形成结果输出

QUERY 1 QUERY 2 person_id

常用链接是 person_id。在子查询中使用时,由于日期范围内可能有多个值,因此会在子查询中给出多于 1 行的错误。

【问题讨论】:

简短的回答是“使用 JOIN”。该连接的外观应该取决于三件事。 1. 哪个表有“duration”列? 2. 哪个表有“度量”列? 3.两个表都有person_id吗? SQL 显然是由某个程序生成的。该程序用于连接吗?或者这是手工完成的事情?了解所涉及的表的实际外观会很有帮助。 第二个查询的输出中没有person_id。如果你愿意,那就加入他们person_id。请显示您当前的代码并描述它的问题所在。 【参考方案1】:

假设您显示的查询按照您的描述工作,那么以下虽然不漂亮,但应该可以解决问题。

SELECT T1.PERSONID, T1.DURATION, T2.MEASURE
FROM
(select 
  sum(duration) AS DURATION,
  pps.person_id AS PERSONID
from 
    anc_per_abs_entries apae,
    anc_absence_types_vl abs,
    per_periods_of_service pps,
    anc_absence_type_reasons_f abtype,
    anc_absence_reasons_f_tl ab_reason

where 1=1
  AND (To_Char(apae.start_date  ,'YYYY-MM-DD') Between to_date(To_Char(:From_Date,'YYYY-MM-DD'),'YYYY-MM-DD') And to_date(To_Char(:To_Date,'YYYY-MM-DD'),'YYYY-MM-DD') )
  AND apae.APPROVAL_STATUS_CD = 'APPROVED'
  AND apae.ABSENCE_STATUS_CD = 'SUBMITTED'
  and abs.name like  'Paid Personal Leave' 
  AND apae.period_of_service_id = pps.period_of_service_id
  AND apae.absence_type_id = abs.absence_type_id
  AND abtype.absence_type_id = abs.absence_type_id
  AND ab_reason.absence_reason_id = abtype.absence_reason_id
  AND apae.absence_type_reason_id = abtype.absence_type_reason_id
  AND pps.person_id = papf.person_id  
group by pps.person_id) T1
JOIN
(select 
   rec.person_id AS PERSONID
   sum(measure) AS MEASURE
from
    time_track rec ,
    time_type rec_type,
    per_all_people_f papf
where 1=1
  AND rec_type.tm_bldg_blk_version = rec.tm_rec_version
  AND rec.tm_rec_type IN ( 'RANGE', 'MEASURE' )
  AND (to_date(To_Char(rec.START_TIME,'YYYY-MM-DD'),'YYYY-MM-DD') Between to_date(To_Char(:From_Date,'YYYY-MM-DD'),'YYYY-MM-DD') And to_date(To_Char(:To_Date,'YYYY-MM-DD'),'YYYY-MM-DD') )
  and papf.person_id = rec.person_id) T2
ON T1.PERSONID = T2.PERSONID

顺便说一句:条件1=1 可以从两个子选择中删除。在这种情况下它实际上什么都不做。

【讨论】:

在某些情况下,员工的度量或持续时间可能不存在。这个查询还会返回一个值吗?例如,表中没有“测量”,但持续时间在一个范围内。那么上述查询是否会返回自加入以来的持续时间而不是左/右加入? 当您说“不存在度量”时,我假设您的意思是该值为空。连接表是用 sum(measure) 定义的,因此如果所有求和的度量值都为空,则生成的“MEASURE”将为零。持续时间也是如此。 Oracle 规范位于:docs.oracle.com/cd/B19306_01/server.102/b14200/functions163.htm。在oracletutorial.com/oracle-aggregate-functions/oracle-sum有一个更简单的解释

以上是关于在 ORACLE SQL 中组合两个 SQL 查询以给出两个列的主要内容,如果未能解决你的问题,请参考以下文章

如何在一条 SQL 语句中组合两个不同的 SQL 查询?

Oracle SQL 查询问题

Oracle select asterisk connect by join sql-92 组合

组合两个 SQL 查询以提高网络利用率

SQL 查询 - 组合两个表,删除重复项并仅保留最新的日期

如何组合两个sql查询?