Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何获得第三份报告以合并客户和订单数据_Sql_Oracle_Oracle Sqldeveloper - Fatal编程技术网

Sql 如何获得第三份报告以合并客户和订单数据

Sql 如何获得第三份报告以合并客户和订单数据,sql,oracle,oracle-sqldeveloper,Sql,Oracle,Oracle Sqldeveloper,我有一个关于保留率的问题。 我有两个表,包括客户数据和订单数据 DISTRIBUTOR as d +---------+-----------+--------------+--------------------+ | ID | SETUP_DT | REINSTATE_DT | LOCAL_REINSTATE_DT | +---------+-----------+--------------+--------------------+ | C111111 | 2018/1/1

我有一个关于保留率的问题。
我有两个表,包括客户数据和订单数据

DISTRIBUTOR as d +---------+-----------+--------------+--------------------+ | ID | SETUP_DT | REINSTATE_DT | LOCAL_REINSTATE_DT | +---------+-----------+--------------+--------------------+ | C111111 | 2018/1/1 | Null | Null | | C111112 | 2015/12/9 | 2018/10/25 | 2018/10/25 | | C111113 | 2018/10/1 | Null | Null | | C111114 | 2018/10/6 | 2018/12/14 | 2018/12/14 | +---------+-----------+--------------+--------------------+ 分销商作为d +---------+-----------+--------------+--------------------+ |ID |设置|恢复|本地|恢复|| +---------+-----------+--------------+--------------------+ |C111111 | 2018/1/1 |空|空| |C111112 | 2015/12/9 | 2018/10/25 | 2018/10/25| |C111113 | 2018/10/1 |空|空| |C111114 | 2018/10/6 | 2018/12/14 | 2018/12/14| +---------+-----------+--------------+--------------------+ 订单为o,请注意数据仅供参考。。。 +---------+----------+-----+ |ID | ORD | u DT | OAL| +---------+----------+-----+ |C111111 | 2018/1/1 | 112| |C111111 | 2018/1/1 | 100| |C111111 | 2018/1/1 | 472| |C111111 | 2018/1/1 | 452| |C111111 | 2018/1/1 | 248| |C111111 | 2018/1/1 | 996| +---------+----------+-----+ 我心目中创建保留率报告的第三个表格 +---------+-----------+-----------+---------------+-----------+ |ID |应用程序|订单|时间差异| TTL金额| +---------+-----------+-----------+---------------+-----------+ |C111111 | 2018/1/1 | 2018/1/1 |-25443| |C111111 | 2018/1/1 | 2018/2/1 | 1 | 7610| |C111111 | 2018/1/1 | 2018/3/1 | 2 | 20180| |C111111 | 2018/1/1 | 2018/4/1 | 3 | 22265| |C111111 | 2018/1/1 | 2018/5/1 | 4 | 34118| |C111111 | 2018/1/1 | 2018/6/1 | 5 | 19523| |C111111 | 2018/1/1 | 2018/7/1 | 6 | 20220| |C111111 | 2018/1/1 | 2018/8/1 | 7 | 2006| |C111111 | 2018/1/1 | 2018/9/1 | 8 | 15813| |C111111 | 2018/1/1 | 2018/10/1 | 9 | 16733| |C111111 | 2018/1/1 | 2018/11/1 | 10 | 20973| |C111112 | 2018/10/1 | 2017/11/1 |-516| |C111112 | 2018/10/1 | 2018/10/1 |-1| |C111113 | 2018/10/1 |空|-空| |C111114 | 2018/12/1 |空|-空| +---------+-----------+-----------+---------------+-----------+ 定义: -APP\u MON:客户加入的月份,是从[d.SETUP\u DT]、[d.Restore\u DT]和[d.LOCAL\u Restore\u DT]的开始日期算起的最长日期 -订单月份:客户购买的月份,即订单日期月份的开始日期 -TimeDiff:应用程序月和订单月之间的月持续时间,例如,如果A的ODR月为2018/1/1,而A的应用程序月为2018/2/1,则持续时间为1。 -TTL_AMT:客户在相关订单日期月份购买的订单总金额 我试图从第三个表中获取数据。 但是我运行下面的代码,速度非常慢。。。我需要一个更有效的方法,因为我有数百万的数据。。。
谢谢。

我认为您不需要使用
unpivot
。要获取最新日期,只需使用
grest()
函数即可

此解决方案有两个子查询,一个子查询用于计算每个新客户的
app\u mon
,另一个子查询用于计算过去两年内下单的所有客户的最早订单日期。这可能不是最有效的方法,但你的首要任务应该是获得正确的结果;一旦有了该选项,您可以根据需要对其进行调整:

with cust as 
(
    select d.dist_id as id
          , greatest(d.setup_dt, d.reinstate_dt, d.local_reinstate_dt) as app_mo 
    from mjensen_dev.gc_distributor d
    where d.setup_dt >= date '2017-01-01'
    or d.reinstate_dt >= date '2017-01-01'
    or d.local_reinstate_dt >= date '2017-01-01'
) , ord as 
(
    select o.dist_id as id
          , min(o.ord_dt) as ord_mon 
          , sum(o.oal) as ord_amt
    from gc_orders o
    where o.ord_dt >= date '2017-01-01'
    group by o.dist_id
          , trunc(o.ord_dt,'mm')
)
select cust.dist_id as id
       , cust.app_mon
       , ord.ord_mon
       , floor(months_between(ord.ord_mon, cust.app_mon ) as mon_diff
       , sum(o.oal) as ord_amt
from cust
     inner join gc_orders o on cust.id = o.dist_id
order by 1, 2
/

您可能希望在我的计算中调整
mon_diff
。该计算将2018/2/1-2018/1/1视为一个月的差额。因为我觉得奇怪的是,在加入当天下订单的客户的
mon_diff
值为1而不是零。但如果您对业务规则的陈述是正确的,则需要在计算中添加1。同样,我没有在日期处理中包含
trunc()
,但您可能希望恢复它。

根据您的代码,我删除了
sql server
标记,并添加了
oracle
标记。SQL Server和oracle是不同的产品,使用不同的SQL方言;您真正使用的是什么RDBMS。我建议Oracle,因为迄今为止
trunc
都不是t-SQL函数。至于帮助,如果你发布样本数据和预期结果,这将对志愿者非常有帮助;最好作为DDL和DML语句,但在其他情况下作为格式化的
text
。样本数据最好作为+。请将您的问题包括在内,您当前的尝试和您想要的结果。至于性能方面的更多细节,我怀疑be
和trunc(o.ORD_DT,'MM')之间存在问题,我不认识Oracle,但在我看来,该条款是不可取的。Edit:根据本文,看起来情况就是这样,它声明“列
{column name}
上的所有谓词必须包含
TRUNC()
”。您的
组中只有
o.ORD_DT
,因此基于该读数,它将不可搜索。如果您也可以共享表结构,可能会使lil更清晰HI@APC,mon_diff对我们来说是可以的。我尝试在select查询中使用
min()
替换
trunc()
;我发现速度更快。你知道原因吗?谢谢。日期列包含NULL,因此我使用代码来查找最大值:
(最大值(d.SETUP\u DT,coalesce(d.restore\u DT,d.SETUP\u DT),coalesce(d.LOCAL\u restore\u DT,d.SETUP\u DT)),作为APP\u MON
我发现我无法从
楼层获得完整的月份(月数之间()
。例如,如果我必须计算2018/6/1到2018/71之间的月差,它会显示“0”而不是“1”……真的吗?我编写了一个SQL FIDLE来处理这些日期值,它返回
1
。 The 3rd Table in my mind to create the retention rate report +---------+-----------+-----------+---------------+-----------+ | ID | APP_MON | ORDER_MON | TimeDiff(Mon) | TTL AMT | +---------+-----------+-----------+---------------+-----------+ | C111111 | 2018/1/1 | 2018/1/1 | - | 25,443 | | C111111 | 2018/1/1 | 2018/2/1 | 1 | 7,610 | | C111111 | 2018/1/1 | 2018/3/1 | 2 | 20,180 | | C111111 | 2018/1/1 | 2018/4/1 | 3 | 22,265 | | C111111 | 2018/1/1 | 2018/5/1 | 4 | 34,118 | | C111111 | 2018/1/1 | 2018/6/1 | 5 | 19,523 | | C111111 | 2018/1/1 | 2018/7/1 | 6 | 20,220 | | C111111 | 2018/1/1 | 2018/8/1 | 7 | 2,006 | | C111111 | 2018/1/1 | 2018/9/1 | 8 | 15,813 | | C111111 | 2018/1/1 | 2018/10/1 | 9 | 16,733 | | C111111 | 2018/1/1 | 2018/11/1 | 10 | 20,973 | | C111112 | 2018/10/1 | 2017/11/1 | - | 516 | | C111112 | 2018/10/1 | 2018/10/1 | - | 1 | | C111113 | 2018/10/1 | Null | - | Null | | C111114 | 2018/12/1 | Null | - | Null | +---------+-----------+-----------+---------------+-----------+ Definition: - APP_MON: the month that the customer joined, which is the max date from the start date of [d.SETUP_DT], [d.REINSTATE_DT] and [d.LOCAL_REINSTATE_DT] - ORD_MON: the month that the customer purchased, which is the start date of the order date month - TimeDiff: The duration by month between APP_MON and ORD_MON, e.g. if A's ODR_MON is 2018/1/1 and A'S APP_MON is 2018/2/1, the duration is 1. - TTL_AMT: the total order amount that the customer bought in the related order date month
with cust as 
(
    select d.dist_id as id
          , greatest(d.setup_dt, d.reinstate_dt, d.local_reinstate_dt) as app_mo 
    from mjensen_dev.gc_distributor d
    where d.setup_dt >= date '2017-01-01'
    or d.reinstate_dt >= date '2017-01-01'
    or d.local_reinstate_dt >= date '2017-01-01'
) , ord as 
(
    select o.dist_id as id
          , min(o.ord_dt) as ord_mon 
          , sum(o.oal) as ord_amt
    from gc_orders o
    where o.ord_dt >= date '2017-01-01'
    group by o.dist_id
          , trunc(o.ord_dt,'mm')
)
select cust.dist_id as id
       , cust.app_mon
       , ord.ord_mon
       , floor(months_between(ord.ord_mon, cust.app_mon ) as mon_diff
       , sum(o.oal) as ord_amt
from cust
     inner join gc_orders o on cust.id = o.dist_id
order by 1, 2
/