sql >> データベース >  >> RDS >> Oracle

顧客データと注文データを組み合わせるための3番目のレポートを取得する方法

    unpivotを使用する必要はないと思います 。最新の日付を取得するには、greatest()を使用するだけです。 機能。

    このソリューションには2つのサブクエリがあり、1つはapp_monを計算するためのものです。 新規顧客と他の顧客ごとに、過去2年間に注文したすべての顧客の最も早い注文日を計算します。これは最もパフォーマンスの高いアプローチではないかもしれませんが、正しい結果を得ることを最優先する必要があります。それができたら、必要に応じて調整できます:

    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を1か月の差として扱います。参加した日に注文した顧客がmon_diffを持っているのは奇妙に思えるので ゼロではなく1の。ただし、ビジネスルールのステートメントが正しい場合は、計算に1を追加する必要があります。同様に、trunc()も含めていません。 日付の処理中ですが、元に戻すことをお勧めします。




    1. SQLAlchemy with_for_update行ロックが機能していませんか?

    2. #1055-SELECTリストの式がGROUP BY句になく、集計されていない列が含まれています。これはsql_mode=only_full_group_byと互換性がありません。

    3. CSV形式のPostgresCOPYコマンドで見積もり処理をオフにすることは可能ですか?

    4. Rails5.2Postgresql上のUUIDを使用したActiveStorage