diff --git a/analysis/mrr/active_mrr.sql b/analysis/mrr/active_mrr.sql index b07f11a..ff07dfe 100644 --- a/analysis/mrr/active_mrr.sql +++ b/analysis/mrr/active_mrr.sql @@ -5,7 +5,7 @@ charges_for_active_plans as from {{env.schema}}.zuora_subscriptions_w_charges_and_amendments where -- make sure the subscription is active - subscr_status = 'Active' + sub_status = 'Active' and ( -- make sure the rate plan charge is current @@ -14,7 +14,7 @@ charges_for_active_plans as and rpc_end >= current_date ) - or subscr_term_type = 'EVERGREEN' + or sub_term_type = 'EVERGREEN' ) and rpc_last_segment = TRUE ) diff --git a/analysis/mrr/total_mrr_by_month.sql b/analysis/mrr/total_mrr_by_month.sql index 0b618d8..82168d8 100644 --- a/analysis/mrr/total_mrr_by_month.sql +++ b/analysis/mrr/total_mrr_by_month.sql @@ -24,11 +24,11 @@ charges_up_to_each_date as ( select date_day, date_month, account_number, mrr, rpc_start, rpc_end, rpc_last_segment, - amend_start, amend_id, subscr_term_type, subscr_start, subscr_end, subscr_id, - subscr_name, subscr_version, + amend_start, amend_id, sub_term_type, sub_start_date, sub_end_date, sub_id, + sub_name, sub_version, dateadd(month,1,date_month) as date_month_plus_one, - max(date_day) over (partition by subscr_name, dateadd(month,1,date_month)) as max_subscr_trunc_date, - max(subscr_version) over (partition by subscr_name, date_month) as max_subscr_version_within_date + max(date_day) over (partition by sub_name, dateadd(month,1,date_month)) as max_subscr_trunc_date, + max(sub_version) over (partition by sub_name, date_month) as max_subscr_version_within_date from dates a left join subscriptions b on 1=1 @@ -58,13 +58,13 @@ all_charges_by_month as ) or ( - subscr_term_type = 'EVERGREEN' - and subscr_start <= dateadd(month, 1, date_month) + sub_term_type = 'EVERGREEN' + and sub_start_date <= dateadd(month, 1, date_month) and ( - subscr_end is null + sub_end_date is null or - subscr_end >= dateadd(month, 1, date_month) + sub_end_date >= dateadd(month, 1, date_month) ) and ( @@ -75,7 +75,7 @@ all_charges_by_month as ) ) and date_day = max_subscr_trunc_date - and subscr_version = max_subscr_version_within_date + and sub_version = max_subscr_version_within_date and dateadd(month, 1, date_month) <= current_date ) diff --git a/analysis/zuora/new_business_metrics.sql b/analysis/zuora/new_business_metrics.sql new file mode 100644 index 0000000..f481e79 --- /dev/null +++ b/analysis/zuora/new_business_metrics.sql @@ -0,0 +1,16 @@ +select + sum(mrr) as gross_new_mrr, + sum(mrr)-lag(sum(mrr),1) over (order by date_trunc('month',contract_effective_date)) as delta_gross_new_mrr, + ((sum(mrr)-lag(sum(mrr),1) over (order by date_trunc('month',contract_effective_date)))/lag(sum(mrr),1) over (order by date_trunc('month',contract_effective_date)))*100 as percent_gross_new_mrr_growth, + sum(mrr)*12 as gross_new_arr, + sum(tcv) as gross_new_bookings, + count(1) as gross_new_subscriptions, + count(distinct account_id) as gross_new_accounts, + avg(mrr) as avg_new_subscription_mrr, + avg(tcv) as avg_contract_value, + avg(datediff(months,sub_start_date,sub_end_date)) as avg_new_subscription_length, + date_trunc('month',contract_effective_date) as date +from {{env.schema}}.zuora_subscription +where sub_version = 1 +group by date_trunc('month',contract_effective_date) +order by date_trunc('month',contract_effective_date) diff --git a/dbt_project.yml b/dbt_project.yml index 1ab3d0d..e739b67 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -9,6 +9,7 @@ model-defaults: materialized: false enabled: true -#models: -# zuora: -# materialized: true +##models: +## zuora: +## enabled: true +## materialized: false diff --git a/models/zuora/zuora_subscription.sql b/models/zuora/zuora_subscription.sql index ecae2de..65f6e15 100644 --- a/models/zuora/zuora_subscription.sql +++ b/models/zuora/zuora_subscription.sql @@ -1,12 +1,158 @@ +with sub_mrr as ( select - id as subscr_id, - status as subscr_status, - termtype as subscr_term_type, - accountid as account_id, - contracteffectivedate::timestamp as subscr_start, - subscriptionenddate::timestamp as subscr_end, - name as subscr_name, - "version#392c30e6081c24fb78ddf6d622de4f33"::integer - as subscr_version, - * -from zuora.zuora_subscription + c.id as sub_id, + sum(cast(a.mrr as decimal(18,2))) as mrr, + sum(cast(a.tcv as decimal(18,2))) as tcv +from zuora.zuora_rate_plan_charge a +join zuora.zuora_rate_plan b +on a.rateplanid = b.id +join zuora.zuora_subscription c +on b.subscriptionid = c.id +where a.islastsegment = TRUE +group by 1 +), + +sub_billing_periods AS ( +SELECT + listagg(billingperiod,', ') WITHIN GROUP (ORDER BY billingperiod) AS billing_periods, + subscriptionid +FROM ( +SELECT + DISTINCT b.subscriptionid,a.billingperiod +FROM zuora.zuora_rate_plan_charge a +JOIN zuora.zuora_rate_plan b +ON a.rateplanid = b.id +where a.islastsegment = TRUE +order by a.mrr desc +) +GROUP BY 2 +), + +sub_charge_types AS ( +SELECT + listagg(chargetype,', ') WITHIN GROUP (ORDER BY chargetype) AS charge_types, + subscriptionid +FROM ( +SELECT + DISTINCT b.subscriptionid,a.chargetype +FROM zuora.zuora_rate_plan_charge a +JOIN zuora.zuora_rate_plan b +ON a.rateplanid = b.id +where a.islastsegment = TRUE +order by a.mrr desc +) +GROUP BY 2 +), + +sub_charge_models AS ( +SELECT + listagg(chargemodel,', ') WITHIN GROUP (ORDER BY chargemodel) AS charge_models, + subscriptionid +FROM ( +SELECT + DISTINCT b.subscriptionid,a.chargemodel +FROM zuora.zuora_rate_plan_charge a +JOIN zuora.zuora_rate_plan b +ON a.rateplanid = b.id +where a.islastsegment = TRUE +order by a.mrr desc +) +GROUP BY 2 +), + +sub_distinct_rate_plans as ( +select + listagg(name,', ') WITHIN GROUP (ORDER BY name DESC) AS distinct_rate_plans, + subscriptionid +from ( +SELECT + DISTINCT b.subscriptionid, + b.name +FROM zuora.zuora_rate_plan_charge a +JOIN zuora.zuora_rate_plan b +ON a.rateplanid = b.id +where a.islastsegment = TRUE +) +group by 2 +), + +sub_distinct_products as ( +select + listagg(name,', ') WITHIN GROUP (ORDER BY name DESC) AS distinct_products, + subscriptionid +from ( +SELECT + DISTINCT b.subscriptionid, + e.name +FROM zuora.zuora_rate_plan_charge a +JOIN zuora.zuora_rate_plan b +ON a.rateplanid = b.id +join zuora.zuora_product_rate_plan_charge c +on a.productrateplanchargeid = c.id +join zuora.zuora_product_rate_plan d +on c.productrateplanid = d.id +join zuora.zuora_product e +on d.productid = e.id +where a.islastsegment = TRUE +) +group by 2 +) + +select + a.id as sub_id, + a.name as sub_name, + a.termtype as term_type, + a.status, + a.renewalsetting as renewal_setting, + a.isinvoiceseparate as is_invoice_separate, + a.currenttermperiodtype as current_term_period_type, + coalesce(lag(cast(b.effectivedate as date),1) over (partition by a.name order by cast(a.version#392c30e6081c24fb78ddf6d622de4f33 as integer)),cast(a.subscriptionstartdate as date)) as sub_effective_date, + cast(a.contractacceptancedate as date) as contract_acceptance_date, + cast(a.contracteffectivedate as date) as contract_effective_date, + cast(a.subscriptionstartdate as date) as sub_start_date, + cast(a.subscriptionenddate as date) as sub_end_date, + cast(a.termstartdate as date) as term_start_date, + cast(a.termenddate as date) as term_end_date, + cast(a.cancelleddate as date) as cancelled_date, + cast(a.createddate as timestamp) as created_date, + cast(a.updateddate as timestamp) as updated_date, + cast(a.originalcreateddate as timestamp) as original_created_date, + cast(a.serviceactivationdate as date) as service_activation_date, + cast(a.version#392c30e6081c24fb78ddf6d622de4f33 as integer) as sub_version, + coalesce(c.mrr,0) as mrr, + coalesce(c.tcv,0) as tcv, + d.billing_periods, + f.charge_types, + g.charge_models, + h.distinct_products, + e.distinct_rate_plans, + a.accountid as account_id, + a.invoiceownerid as invoice_owner_id, + a.createdbyid as created_by_id, + a.updatedbyid as updated_by_id, + a.autorenew as auto_renew, + a.renewaltermperiodtype as renewal_term_period_type, + cast(a."renewalterm#d6921dfe0b38e14b10fb11fbb53af737" as integer) as renewal_term, + cast(a."currentterm#43cd92dff45a80fd1ab8e39f16b6af51" as integer) as current_term, + a.initialtermperiodtype as initial_term_period_type, + cast(a."initialterm#58b70e8fe6414e59d8d03a9eb211ab74" as integer) as initial_term, + a.previoussubscriptionid as previous_subscription_id, + a.originalid as original_id, + a.notes, + a.creatoraccountid as creator_account_id, + a.creatorinvoiceownerid as creator_invoice_owner_id +from zuora.zuora_subscription a +left join zuora.zuora_amendment b +on a.id = b.subscriptionid +left join sub_mrr c +on a.id = c.sub_id +left join sub_billing_periods d +on a.id = d.subscriptionid +left join sub_distinct_rate_plans e +on a.id = e.subscriptionid +left join sub_charge_types f +on a.id = f.subscriptionid +left join sub_charge_models g +on a.id = g.subscriptionid +left join sub_distinct_products h +on a.id = h.subscriptionid diff --git a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql index 4da0efa..c7c4047 100644 --- a/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql +++ b/models/zuora/zuora_subscriptions_w_charges_and_amendments.sql @@ -2,26 +2,26 @@ with subscr_w_amendments as ( select - account_number, acc.account_id, sub.subscr_id, - subscr_name, subscr_status, subscr_term_type, - subscr_start, subscr_end, subscr_version, amend_id, amend_start + account_number, acc.account_id, sub.sub_id, + sub_name, sub.status, sub.term_type, + sub_start_date, sub_end_date, sub_version, amend_id, amend_start from {{env.schema}}.zuora_account acc inner join {{env.schema}}.zuora_subscription sub on acc.account_id = sub.account_id -- add ammendments left outer join {{env.schema}}.zuora_amendment amend - on sub.subscr_id = amend.subscr_id + on sub.sub_id = amend.subscr_id ) select - account_number, account_id, sub.subscr_id, - subscr_name, subscr_status, subscr_term_type, - subscr_start, subscr_end, subscr_version, amend_id, amend_start, + account_number, sub.account_id, sub.sub_id, + sub.sub_name, sub.status as sub_status, sub.term_type as sub_term_type, + sub.sub_start_date, sub.sub_end_date, sub.sub_version, amend_id, amend_start, rpc_start, rpc_end, rpc_last_segment, - min(subscr_start) over() as first_subscr, + min(sub.sub_start_date) over() as first_subscr, "@mrr" as mrr from subscr_w_amendments sub inner join {{env.schema}}.zuora_rate_plan rp - on rp.subscr_id = sub.subscr_id + on rp.subscr_id = sub.sub_id inner join {{env.schema}}.zuora_rate_plan_charge rpc on rpc.rate_plan_id = rp.rate_plan_id