Sql 如何从一个表中组合这两个Oracle查询
我有一个Oracle表,其中包含几个活动的每日计数。我需要创建一个查询,该查询显示一个月的每日活动和仅上一年的当月活动的总和。因此,我最终会有6个类似这样的专栏: 年|月|合计|上一年|上一个月|预计算 我创建了这两个SQL查询,其中一个提供了有关输入日期参数的信息: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
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