如何在SQL Developer

时间:2017-06-08 18:57:28

标签: sql oracle

我正在修改一个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?

0 个答案:

没有答案