在 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 查询以给出两个列的主要内容,如果未能解决你的问题,请参考以下文章