Sql 如何从一个表中组合这两个Oracle查询

Sql 如何从一个表中组合这两个Oracle查询,sql,oracle,Sql,Oracle,我有一个Oracle表,其中包含几个活动的每日计数。我需要创建一个查询,该查询显示一个月的每日活动和仅上一年的当月活动的总和。因此,我最终会有6个类似这样的专栏: 年|月|合计|上一年|上一个月|预计算 我创建了这两个SQL查询,其中一个提供了有关输入日期参数的信息: select extract(year from activitydate) as yr, extract(MONTH from activitydate) as mon, Sum(dicalls) from updstats

我有一个Oracle表,其中包含几个活动的每日计数。我需要创建一个查询,该查询显示一个月的每日活动和仅上一年的当月活动的总和。因此,我最终会有6个类似这样的专栏:

年|月|合计|上一年|上一个月|预计算

我创建了这两个SQL查询,其中一个提供了有关输入日期参数的信息:

select extract(year from activitydate) as yr, extract(MONTH from 
activitydate) as mon, Sum(dicalls)
from updstats
Where ACTIVITYDATE BETWEEN TO_DATE (:STARTDATE,'MM/DD/YYYY') AND 
TO_DATE(:ENDDATE,'MM/DD/YYYY')
GROUP BY extract(year from activitydate), extract(MONTH from activitydate)
order by yr, mon
这一个提供了前一个日期范围的数据:

select extract(year from activitydate) as Pyr, extract(MONTH from 
activitydate) as Pmon, Sum(dicalls)
from updstats
Where ACTIVITYDATE BETWEEN add_months(TO_DATE (:STARTDATE,'MM/DD/YYYY'),-12) 
AND add_months(TO_DATE(:ENDDATE,'MM/DD/YYYY'),-12)
GROUP BY extract(year from activitydate), extract(MONTH from activitydate)
order by Pyr, Pmon

我被卡住了,想不出如何组合这两个查询来提供我需要的数据集。

您可以将这两个查询作为带有rownumber的子查询连接起来

 select * from 
            (select extract(year from activitydate) as yr, 
            extract(MONTH from activitydate) as mon, 
            Sum(dicalls),
           row_number() over(partition by extract(year from activitydate),extract(MONTH from activitydate) order by extract(year from activitydate),extract(MONTH from activitydate)) rn1
            from updstats Where ACTIVITYDATE BETWEEN TO_DATE (:STARTDATE,'MM/DD/YYYY') AND TO_DATE(:ENDDATE,'MM/DD/YYYY')
            GROUP BY extract(year from activitydate), extract(MONTH from activitydate)
            order by yr, mon) as n 
       join (select extract(year from activitydate) as Pyr, 
           extract(MONTH from activitydate) as Pmon,             
           Sum(dicalls),
           row_number() over(partition by extract(year from activitydate) ,extract(MONTH from activitydate) order by extract(year from activitydate) ,extract(MONTH from activitydate) as rn2
            from updstats  Where ACTIVITYDATE BETWEEN add_months(TO_DATE (:STARTDATE,'MM/DD/YYYY'),-12) 
            AND add_months(TO_DATE(:ENDDATE,'MM/DD/YYYY'),-12)
            GROUP BY extract(year from activitydate), extract(MONTH from activitydate)
            order by Pyr, Pmon)) as p on (n.rn1=p.rn2) order by n.yr,n.mon

我将加入月和年两个表的结果

select  *
from    (
            select  extract(year from activitydate) as yr,
                    extract(month from activitydate) as mon,
                    Sum(dicalls)
            from    updstats
            where   activitydate between to_date(:STARTDATE, 'MM/DD/YYYY') and
                    to_date(:ENDDATE, 'MM/DD/YYYY')
            group by  extract(year from activitydate),
                      extract(month from activitydate)
        ) ty
join    (
            select  extract(year from activitydate) as Pyr,
                    extract(month from activitydate) as Pmon,
                    Sum(dicalls)
            from    updstats
            where   activitydate between add_months(to_date(:STARTDATE, 'MM/DD/YYYY'), -12)
                    and add_months(to_date(:ENDDATE, 'MM/DD/YYYY'), -12)
            group by  extract(year from activitydate), 
                      extract(month from activitydate)
        ) ly
on      ty.yr = ly.Pyr + 1 and
        ty.mon = ly.Pmon
order by  ty.yr, ty.mon

月份是一样的,所以你只需要让每年都与上一年相匹配

,因为没有人通过CTE回答,所以你就可以开始了

with tbl_A as (
select extract(year from activitydate) as yr, extract(MONTH from 
activitydate) as mon, Sum(dicalls)
from updstats
Where ACTIVITYDATE BETWEEN TO_DATE (:STARTDATE,'MM/DD/YYYY') AND 
TO_DATE(:ENDDATE,'MM/DD/YYYY')
GROUP BY extract(year from activitydate), extract(MONTH from activitydate)
order by yr, mon
),
tbl_B as(

select extract(year from activitydate) as Pyr, extract(MONTH from 
activitydate) as Pmon, Sum(dicalls)
from updstats
Where ACTIVITYDATE BETWEEN add_months(TO_DATE (:STARTDATE,'MM/DD/YYYY'),-12) 
AND add_months(TO_DATE(:ENDDATE,'MM/DD/YYYY'),-12)
GROUP BY extract(year from activitydate), extract(MONTH from activitydate)
order by Pyr, Pmon
)
select * from tbl_A a inner join tbl_B b on a.yr = b.yr and a.mon = b.mon;

获取每月和每年的迪卡尔总数,并使用
lag
获取上一年同一月份的值。使用
where
子句筛选外部查询中的日期范围。(此查询输出表中的所有月份和年份。)


您需要将
where
子句添加到外部查询中。
select yr,mth,dicalls
,lag(yr) over(partition by mth order by yr) prev_yr
,lag(mth) over(partition by mth order by yr) prev_mth
,lag(dicalls) over(partition by mth order by yr) prev_dicalls
from (select sum(dicalls) as dicalls,extract(month from activitydate) as mth,extract(year from activitydate) as yr
      from updstats
      group by extract(month from activitydate),extract(year from activitydate)
     ) x
order by 1,2