diff --git a/models/marts/reporting/rep_shipping__company_order_usages.sql b/models/marts/reporting/rep_shipping__company_order_usages.sql new file mode 100644 index 0000000..edc47af --- /dev/null +++ b/models/marts/reporting/rep_shipping__company_order_usages.sql @@ -0,0 +1,163 @@ +{% set time_grain_list = ["month", "quarter", "year"] %} +{% set monthly_cbm_rank_list = [1.25, 5, 20] %} -- 0->1.25 40% 1.25->5 40% 5->20 15% 20->onward 5% +{% set quarterly_cbm_rank_list = [1.75, 10, 30] %} +{% set yearly_cbm_rank_list = [2.5, 20, 60] %} + +-- IMPORT +WITH shipping_companies AS ( + SELECT * FROM {{ ref('dim_shipping__companies') }} +), + +origin_warehouse_shipping_packing_lists AS ( + SELECT * FROM {{ ref('fct_shipping__origin_warehouse_shipping_packing_lists') }} +), + +dates AS ( + SELECT * FROM {{ ref('dim__dates') }} +), + +-- LOGIC +{% for time_grain in time_grain_list %} + sub_company_register_{{time_grain}} AS ( + SELECT + sub_company_id, + sub_company_marking_id, + dates.first_day_of_{{time_grain}} AS company_register_{{time_grain}} + + FROM shipping_companies + + LEFT JOIN dates + ON (date(shipping_companies.sub_company_created_datetime) = dates.date_day) + ), + + origin_warehouse_shipping_packing_list_{{time_grain}} AS ( + SELECT + origin_warehouse_shipping_packing_lists.*, + dates.first_day_of_{{time_grain}} AS origin_warehouse_shipping_order_created_{{time_grain}} + + FROM origin_warehouse_shipping_packing_lists + + LEFT JOIN dates + ON (date(origin_warehouse_shipping_packing_lists.origin_warehouse_shipping_order_created_datetime) = dates.date_day) + ), + + register_date_and_company_id_combination_{{time_grain}} AS ( + SELECT + DISTINCT c.company_register_{{time_grain}} AS event_date, + '{{time_grain|upper}}LY' AS time_grain_filter, + c1.sub_company_id, + c1.sub_company_marking_id + + FROM sub_company_register_{{time_grain}} AS c + + CROSS JOIN sub_company_register_{{time_grain}} AS c1 + + WHERE c.company_register_{{time_grain}} >= c1.company_register_{{time_grain}} + + ORDER BY event_date + ), + + company_sale_by_time_grain_{{time_grain}} AS ( + SELECT + register_date_and_company_id_combination_{{time_grain}}.event_date, + register_date_and_company_id_combination_{{time_grain}}.time_grain_filter, + register_date_and_company_id_combination_{{time_grain}}.sub_company_id, + register_date_and_company_id_combination_{{time_grain}}.sub_company_marking_id, + + SUM(IFF(origin_warehouse_shipping_order_status = 'APPROVED' OR + origin_warehouse_shipping_order_status = 'COMPLETED', + total_order_cbm, + 0)) AS total_cbm_completed_approved, + + COUNT(DISTINCT(IFF(origin_warehouse_shipping_order_status = 'APPROVED' OR + origin_warehouse_shipping_order_status = 'COMPLETED', + old_origin_warehouse_shipping_packing_list_id, + NULL))) AS total_order_completed_approved, + + {% if time_grain == "month" -%} + {%- set cbm_rank_list = monthly_cbm_rank_list -%} + {%- elif time_grain == "quarter"%} + {%- set cbm_rank_list = quarterly_cbm_rank_list -%} + {%- elif time_grain == "year"%} + {%- set cbm_rank_list = yearly_cbm_rank_list -%} + {%- else -%} + {%- set cbm_rank_list = [] -%} + {%- endif -%} + + CASE + WHEN total_cbm_completed_approved = 0 + THEN 'NO_USAGE' + WHEN total_cbm_completed_approved <= {{cbm_rank_list[0]}} + THEN 'LOW_USAGE' + WHEN (total_cbm_completed_approved > {{cbm_rank_list[0]}} AND total_cbm_completed_approved <= {{cbm_rank_list[1]}}) + THEN 'MEDIUM_USAGE' + WHEN (total_cbm_completed_approved > {{cbm_rank_list[1]}} AND total_cbm_completed_approved <= {{cbm_rank_list[2]}}) + THEN 'HIGH_USAGE' + WHEN total_cbm_completed_approved > {{cbm_rank_list[2]}} + THEN 'SUPER_HIGH_USAGE' + ELSE 'ERROR' + END AS company_usage_type, + + CASE + WHEN total_order_completed_approved = 0 + THEN 'NO_ORDER' + WHEN MAX(is_first_time_sub_company) = 1 + THEN 'FIRST_TIME_ORDER' + WHEN LAG(total_order_completed_approved) OVER (PARTITION BY register_date_and_company_id_combination_{{time_grain}}.time_grain_filter, register_date_and_company_id_combination_{{time_grain}}.sub_company_id, register_date_and_company_id_combination_{{time_grain}}.sub_company_marking_id ORDER BY event_date) != 0 + THEN 'RECURRING_ORDER' + WHEN LAG(total_order_completed_approved) OVER (PARTITION BY register_date_and_company_id_combination_{{time_grain}}.time_grain_filter, register_date_and_company_id_combination_{{time_grain}}.sub_company_id, register_date_and_company_id_combination_{{time_grain}}.sub_company_marking_id ORDER BY event_date) = 0 + THEN 'REACTIVE_ORDER' + ELSE 'ERROR' + END AS event_type + + + FROM register_date_and_company_id_combination_{{time_grain}} + + LEFT JOIN origin_warehouse_shipping_packing_list_{{time_grain}} + ON (register_date_and_company_id_combination_{{time_grain}}.sub_company_id = origin_warehouse_shipping_packing_list_{{time_grain}}.sub_company_id + AND + register_date_and_company_id_combination_{{time_grain}}.event_date = origin_warehouse_shipping_packing_list_{{time_grain}}.origin_warehouse_shipping_order_created_{{time_grain}}) + + GROUP BY + register_date_and_company_id_combination_{{time_grain}}.event_date, + register_date_and_company_id_combination_{{time_grain}}.time_grain_filter, + register_date_and_company_id_combination_{{time_grain}}.sub_company_id, + register_date_and_company_id_combination_{{time_grain}}.sub_company_marking_id + ), + +{% endfor %} + +union_all_time_grain AS ( + {% for time_grain in time_grain_list %} + SELECT * FROM company_sale_by_time_grain_{{time_grain}} + {%- if not loop.last %} UNION{% endif -%} + {% endfor %} +), + +--FINAL +final__rep_shipping__company_order_usages AS ( + SELECT + -- ids + {{ dbt_utils.generate_surrogate_key(['event_date', 'time_grain_filter', 'sub_company_id']) }} AS company_order_usage_sk, + sub_company_id, + sub_company_marking_id, + + -- dimensions + time_grain_filter, + company_usage_type, + event_type, + + -- measures + total_cbm_completed_approved, + total_order_completed_approved, + + -- date/times + event_date, + + -- metadata + '{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime + + FROM union_all_time_grain +) + +SELECT * FROM final__rep_shipping__company_order_usages \ No newline at end of file