我正在修改一个SQL Developer查询,该查询从选定的时间段为销售人员提取交易数据;选定的期间总是一个月,例如其中periodname =' 2017年3月'。
然而,一些销售人员每月支付,而其他人每季度支付。根据当前查询,如果季度销售人员在1月份进行了交易,但在2月或3月没有交易,那么他们只会在2017年1月的拉动中出现。
我想将季度销售人员的所有交易QTD退回,并继续为每月销售人员返回MTD交易;即如果我执行2017年3月的查询,季度销售人员将看到2017年1月,2017年2月和2017年3月的任何交易,而月度销售人员只会看到2017年3月的交易。如果我在2017年6月运行查询,季度销售人员应查看2017年4月和2017年6月的任何交易,月度销售人员将看到2017年6月的交易。
我的桌子有以下几个关键要素:
PERIODSEQ PARENTSEQ SALESPERSONNAME TRANSACTIONTYPE PAYFREQ
109 106 Doe, John in-store order Quarterly
111 110 Doe, John online order Quarterly
112 110 Smith, Jane online order Monthly
每个月的周期都有一个周期序列ID;每个周期序列都有一个父序列ID,可以更广泛地组织周期表中的周期。例如,在上面,期间序列109是2017年3月,并且是父序列106的一部分,其被称为第1季度。请参阅下面的期间表的示例:
PERIODSEQ PERIODNAME PARENTSEQ
106 Quarter 1 105
107 January 2017 106
108 February 2017 106
109 March 2017 106
110 Quarter 2 105
111 April 2017 110
112 June 2017 110
This post对我很有帮助,因为我之前曾尝试使用case
语句返回多个值,即
case when payfrequency = 'Quarterly' then add_months(sysdate, -3)
或
case when transactiontable.parentseq = periodtable.parentseq then add_months(sysdate, -3)
但上述帖子明确指出case
语句不会返回多个值。我还尝试使用union
语句,并让每个where
条件分别引用每月或每季度,但我仍然不确定这会引出多个值:
select * from (
select r.periodseq, r.parentseq, r.name, r.transactiontype, r.payfreq
from transactiontable r
inner join periodtable p
on p.periodseq = r.periodseq
where r.payfreq = 'Monthly'
and r.periodseq = p.periodseq
and p.periodname = 'April 2017' )
UNION ALL
select * from (
select s.periodseq, s.parentseq, s.name, s.transactiontype, s.payfreq
from transactiontable s
inner join periodtable p
on p.periodseq = s.periodseq
where r.payfreq = 'Quarterly'
and s.periodstartdate <= p.startdate
这个逻辑会起作用吗?我只有2017年4月的测试数据,有了这个查询,我仍然可以看到我希望看到的所有交易。我不确定这是否是理想的解决方案,或者当我的测试数据中添加更多句点时它是否真的有效。
有没有更好的方法来编写查询以获得我正在寻找的结果?也许我可以修改查询以更有效地利用父seq / period seq?