在Oracle中使用同一列联接两个查询的结果

时间:2019-03-18 07:39:34

标签: sql oracle join group-by union

我正在使用Oracle。我目前正在一张具有两个不同查询输出的表上工作。我想将两个输出合并为一个输出,我尝试了Union all和union,但没有运气。

with D as 
(
Select 
VP.HOMELABORLEVELNM4 as DEPT,
SUM(X.DURATIONSECSQTY/3600.0) as ACTL_HR,
SUM(X.WAGEAMT) as ACTL_DLR,
to_char(X.APPLYDTM,'YYYY-MM') AS MONTHLY,
VP.HOMELABORLEVELDSC4 as DESCRIPTION,
NULL as DAILY,
NULL as DEPT1,
NULL as ACTL_HR1,
NULL as ACTL_DLR1
from VP_EMPLOYEEV42 VP,
WFCTOTAL X
where 
VP.PERSONID = X.EMPLOYEEID and
X.APPLYDTM between '01-DEC-18' and '31-DEC-18' and
X.EMPLOYEEID in (select personid from PERSONCSTMDATA where CUSTOMDATADEFID ='154' and PERSONCSTMDATATXT = 'USKEANE')
group by VP.HOMELABORLEVELNM4, VP.HOMELABORLEVELDSC4, to_char(X.APPLYDTM,'YYYY-MM')
union all
Select 
NULL as DEPT,
NULL as ACTL_HR,
NULL as ACTL_DLR,
NULL as MONTHLY,
VP.HOMELABORLEVELDSC4 as DESCRIPTION,
to_char(X.APPLYDTM) as DAILY,
VP.HOMELABORLEVELNM4 as DEPT1,
SUM(X.DURATIONSECSQTY/3600.0) as ACTL_HR1,
SUM(X.WAGEAMT) as ACTL_DLR1
from VP_EMPLOYEEV42 VP,
WFCTOTAL X
where 
VP.PERSONID = X.EMPLOYEEID and
X.APPLYDTM = '31-DEC-18' and
X.EMPLOYEEID in (select personid from PERSONCSTMDATA where CUSTOMDATADEFID ='154' and PERSONCSTMDATATXT = 'USKEANE')
group by VP.HOMELABORLEVELNM4, VP.HOMELABORLEVELDSC4, to_char(X.APPLYDTM)
)
select D.DEPT DEPT,  
SUM(D.ACTL_HR) ACTL_HR, 
SUM(D.ACTL_DLR) ACTL_DLR,
D.MONTHLY MONTHLY, 
D.DESCRIPTION DESCRIPTION, 
D.DAILY DAILY, 
D.DEPT1 DEPT1, 
SUM(D.ACTL_HR1) ACTL_HR1, 
SUM(D.ACTL_DLR1) ACTL_DLR1
from D
group by D.DEPT, D.MONTHLY, D.DAILY, D.DESCRIPTION, D.DEPT1
order by DESCRIPTION

它给我这样的输出

-DEPT-HR-DLR-MONTHLY-DESC-DAILY-DEPT-HR-DLR-

-1-12-12-11 / 1-Manu-NULL-NULL-NULL-NULL-

-NULL-NULL-NULL-NULL-Manu-17-1-12-12-

2 个答案:

答案 0 :(得分:0)

只要要分组的任何字段中的值为空,您都将收到它作为单独的行。我认为您想查看所需的输出,然后我们可以尝试用代码来解释它。 提示:您可能要研究JOIN,并且仅对D.MONTHLY,D.DAILY,D.DESCRIPTION,D.DEPT1进行分组,因为其中一个表中缺少DEPT列。

答案 1 :(得分:0)

我认为您的目标(对我而言还不太清楚)可能更容易遵循以下模式来实现:

with Query1 as (select fields from table where conditions are met),
     Query2 as (select fields from table where conditions are met) 
select  fields 
from Query1 
     outer join Query2 
     on Query1.identifier_for_match=Query2.identifier_for_match
where optional conditions are true

注意-在您的情况下,“ identifier_for_match”可能是employeeid(这将使其成为Query1 / Query2结果集的必需部分)-您必须查看模型并弄清楚查询应如何组合行。 另外-如果提供了表的DDL及其相同的一些数据(包括所需的输出),则更容易提供适合表的答案