SQL
Design marketplace
Transaction Facts
Transaction Facts model for design marketplace.
source-preserved
Blocks
transaction_facts.sql · 65 lines
inferred
-- models/transaction_facts.sql
{{ config(materialized='table') }}
SELECT
proposal.subscriber_id AS maker_id
, COUNT(*) AS lifetime_transactions
, (SUM(CASE WHEN proposal.accepted_on > '2014-01-01' THEN 1 ELSE 0 END)) AS 2014_transactions
, SUM(CASE WHEN project.job_type = 1 THEN 1 ELSE 0 END) AS lifetime_private_transactions
, SUM(CASE WHEN project.job_type = 2 THEN 1 ELSE 0 END) AS lifetime_public_transactions
, SUM(CASE WHEN DATEDIFF(proposal.delivery_date, project.done_on) > -1 THEN 1 ELSE 0 END) AS on_time_completed_jobs
, SUM(CASE WHEN DATEDIFF(proposal.delivery_date, project.done_on) < 0 THEN 1 ELSE 0 END) AS late_completed_jobs
, AVG(DATEDIFF(project.done_on, proposal.accepted_on)) AS average_days_job_completion
, SUM(CASE WHEN project.status = 8 THEN 1 ELSE 0 END) AS in_progress_jobs
, MIN(proposal.accepted_on) AS initial_transaction
, MAX(proposal.accepted_on) AS last_transaction
, ROUND(AVG(proposal.amount + proposal.shipping),2) AS average_gross_transaction_value
, ROUND(SUM(proposal.amount + proposal.shipping),2) AS lifetime_gross_transaction_value
, ROUND(SUM(CASE WHEN project.job_type = 1 THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS lifetime_private_gross_transaction_value
, ROUND(SUM(CASE WHEN project.job_type = 2 THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS lifetime_public_gross_transaction_value
, ROUND(SUM(CASE WHEN proposal.accepted_on > '2014-01-01' THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS 2014_gross_transaction_value
, ROUND(AVG(CASE WHEN proposal.accepted_on > '2014-01-01' THEN (proposal.amount + proposal.shipping) ELSE 0 END),2) AS 2014_average_gross_transaction_value
, COUNT(DISTINCT(review.id)) AS review_count
, AVG(review.rating*1.00000) AS average_review_score
, MIN(proposal.delivery_date) AS first_delivery
, MAX(proposal.delivery_date) AS last_delivery
FROM
tracking_affiliatelead AS project
LEFT JOIN marketplace_partnerlead AS request ON request.id = project.affiliate_body_id
LEFT JOIN project_proposals AS proposal ON proposal.project_id = project.id
LEFT JOIN jobboard_review as review ON review.project_id = project.id
WHERE
proposal.accepted_on IS NOT NULL
AND project.bi_duplicate_source IS NULL
AND project.status NOT IN (1,7)
GROUP BY
maker_id
# models/schema.yml
version: 2
models:
- name: transaction_facts
columns:
- name: maker_id
tests:
- unique
- not_null
- name: average_review_score
- name: average_review_score_tiered
- name: lifetime_transactions
- name: 2014_transactions
- name: lifetime_private_transactions
- name: lifetime_public_transactions
- name: on_time_completed_jobs
- name: average_days_job_completion
- name: in_progress_jobs
- name: lifetime_transactions_tiered
- name: lifetime_transactions_tiered2
- name: 2014_gross_transaction_value
- name: average_gross_transaction_value
- name: 2014_average_gross_transaction_value
- name: lifetime_gross_transaction_value
- name: lifetime_gross_transaction_value_tiered
- name: review_count
- name: lifetime_project_on_time_completion_percentage
Assumptions
- materialized='table' inferred from a LookML persist hint (persist_for / datagroup / sql_trigger_value).
- schema.yml columns come from view dimensions; a primary_key dimension gets unique + not_null tests.
transaction_facts.sql · 33 lines
source-preserved
validation: not checked
SELECT
proposal.subscriber_id AS maker_id
, COUNT(*) AS lifetime_transactions
, (SUM(CASE WHEN proposal.accepted_on > '2014-01-01' THEN 1 ELSE 0 END)) AS 2014_transactions
, SUM(CASE WHEN project.job_type = 1 THEN 1 ELSE 0 END) AS lifetime_private_transactions
, SUM(CASE WHEN project.job_type = 2 THEN 1 ELSE 0 END) AS lifetime_public_transactions
, SUM(CASE WHEN DATEDIFF(proposal.delivery_date, project.done_on) > -1 THEN 1 ELSE 0 END) AS on_time_completed_jobs
, SUM(CASE WHEN DATEDIFF(proposal.delivery_date, project.done_on) < 0 THEN 1 ELSE 0 END) AS late_completed_jobs
, AVG(DATEDIFF(project.done_on, proposal.accepted_on)) AS average_days_job_completion
, SUM(CASE WHEN project.status = 8 THEN 1 ELSE 0 END) AS in_progress_jobs
, MIN(proposal.accepted_on) AS initial_transaction
, MAX(proposal.accepted_on) AS last_transaction
, ROUND(AVG(proposal.amount + proposal.shipping),2) AS average_gross_transaction_value
, ROUND(SUM(proposal.amount + proposal.shipping),2) AS lifetime_gross_transaction_value
, ROUND(SUM(CASE WHEN project.job_type = 1 THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS lifetime_private_gross_transaction_value
, ROUND(SUM(CASE WHEN project.job_type = 2 THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS lifetime_public_gross_transaction_value
, ROUND(SUM(CASE WHEN proposal.accepted_on > '2014-01-01' THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS 2014_gross_transaction_value
, ROUND(AVG(CASE WHEN proposal.accepted_on > '2014-01-01' THEN (proposal.amount + proposal.shipping) ELSE 0 END),2) AS 2014_average_gross_transaction_value
, COUNT(DISTINCT(review.id)) AS review_count
, AVG(review.rating*1.00000) AS average_review_score
, MIN(proposal.delivery_date) AS first_delivery
, MAX(proposal.delivery_date) AS last_delivery
FROM
tracking_affiliatelead AS project
LEFT JOIN marketplace_partnerlead AS request ON request.id = project.affiliate_body_id
LEFT JOIN project_proposals AS proposal ON proposal.project_id = project.id
LEFT JOIN jobboard_review as review ON review.project_id = project.id
WHERE
proposal.accepted_on IS NOT NULL
AND project.bi_duplicate_source IS NULL
AND project.status NOT IN (1,7)
GROUP BY
maker_id
transaction_facts.view.lkml · 158 lines
inferred
view: transaction_facts {
derived_table: {
sql: SELECT
proposal.subscriber_id AS maker_id
, COUNT(*) AS lifetime_transactions
, (SUM(CASE WHEN proposal.accepted_on > '2014-01-01' THEN 1 ELSE 0 END)) AS 2014_transactions
, SUM(CASE WHEN project.job_type = 1 THEN 1 ELSE 0 END) AS lifetime_private_transactions
, SUM(CASE WHEN project.job_type = 2 THEN 1 ELSE 0 END) AS lifetime_public_transactions
, SUM(CASE WHEN DATEDIFF(proposal.delivery_date, project.done_on) > -1 THEN 1 ELSE 0 END) AS on_time_completed_jobs
, SUM(CASE WHEN DATEDIFF(proposal.delivery_date, project.done_on) < 0 THEN 1 ELSE 0 END) AS late_completed_jobs
, AVG(DATEDIFF(project.done_on, proposal.accepted_on)) AS average_days_job_completion
, SUM(CASE WHEN project.status = 8 THEN 1 ELSE 0 END) AS in_progress_jobs
, MIN(proposal.accepted_on) AS initial_transaction
, MAX(proposal.accepted_on) AS last_transaction
, ROUND(AVG(proposal.amount + proposal.shipping),2) AS average_gross_transaction_value
, ROUND(SUM(proposal.amount + proposal.shipping),2) AS lifetime_gross_transaction_value
, ROUND(SUM(CASE WHEN project.job_type = 1 THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS lifetime_private_gross_transaction_value
, ROUND(SUM(CASE WHEN project.job_type = 2 THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS lifetime_public_gross_transaction_value
, ROUND(SUM(CASE WHEN proposal.accepted_on > '2014-01-01' THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS 2014_gross_transaction_value
, ROUND(AVG(CASE WHEN proposal.accepted_on > '2014-01-01' THEN (proposal.amount + proposal.shipping) ELSE 0 END),2) AS 2014_average_gross_transaction_value
, COUNT(DISTINCT(review.id)) AS review_count
, AVG(review.rating*1.00000) AS average_review_score
, MIN(proposal.delivery_date) AS first_delivery
, MAX(proposal.delivery_date) AS last_delivery
FROM
tracking_affiliatelead AS project
LEFT JOIN marketplace_partnerlead AS request ON request.id = project.affiliate_body_id
LEFT JOIN project_proposals AS proposal ON proposal.project_id = project.id
LEFT JOIN jobboard_review as review ON review.project_id = project.id
WHERE
proposal.accepted_on IS NOT NULL
AND project.bi_duplicate_source IS NULL
AND project.status NOT IN (1,7)
GROUP BY
maker_id ;;
persist_for: "60 minutes"
}
dimension: maker_id {
type: int
primary_key: yes
hidden: yes
}
dimension: average_review_score {
type: number
sql: ${TABLE}.average_review_score ;;
}
dimension: average_review_score_tiered {
type: tier
sql: ${TABLE}.average_review_score ;;
}
dimension: lifetime_transactions {
type: number
}
dimension: 2014_transactions {
type: number
sql: ${TABLE}.2014_transactions ;;
}
dimension: lifetime_private_transactions {
type: number
}
dimension: lifetime_public_transactions {
type: number
}
dimension: on_time_completed_jobs {
type: int
hidden: yes
}
dimension: average_days_job_completion {
type: number
sql: ${TABLE}.average_days_job_completion ;;
}
dimension: in_progress_jobs {
type: int
}
dimension: lifetime_transactions_tiered {
type: tier
sql: ${lifetime_transactions} ;;
}
dimension: lifetime_transactions_tiered2 {
type: tier
sql: ${lifetime_transactions} ;;
}
dimension: 2014_gross_transaction_value {
type: number
}
dimension: average_gross_transaction_value {
type: number
}
dimension: 2014_average_gross_transaction_value {
type: number
}
dimension: lifetime_gross_transaction_value {
type: number
}
dimension: lifetime_gross_transaction_value_tiered {
type: tier
sql: ${lifetime_gross_transaction_value} ;;
}
dimension: review_count {
type: int
}
dimension: lifetime_project_on_time_completion_percentage {
type: number
sql: 100.00 * ${TABLE}.on_time_completed_jobs/(${TABLE}.on_time_completed_jobs + ${TABLE}.late_completed_jobs) ;;
}
dimension_group: initial_transaction {
type: time
timeframes: [time, date, week, month]
sql: ${TABLE}.initial_transaction ;;
}
dimension_group: last_transaction {
type: time
timeframes: [date, week, month]
sql: ${TABLE}.last_transaction ;;
}
dimension_group: first_scheduled_delivery {
type: time
timeframes: [date, week, month]
sql: ${TABLE}.first_delivery ;;
}
measure: total_2014_gross_transaction_value {
type: sum
sql: ${2014_gross_transaction_value} ;;
}
measure: total_lifetime_gross_transaction_value {
type: sum
sql: ${lifetime_gross_transaction_value} ;;
}
measure: percentage_of_projects_reviewed {
type: number
sql: 100.00 * ${review_count}/${lifetime_transactions} ;;
}
}
transaction_facts.view.lookml · 117 lines
source-preserved
- view: transaction_facts
derived_table:
sql: SELECT
proposal.subscriber_id AS maker_id
, COUNT(*) AS lifetime_transactions
, (SUM(CASE WHEN proposal.accepted_on > '2014-01-01' THEN 1 ELSE 0 END)) AS 2014_transactions
, SUM(CASE WHEN project.job_type = 1 THEN 1 ELSE 0 END) AS lifetime_private_transactions
, SUM(CASE WHEN project.job_type = 2 THEN 1 ELSE 0 END) AS lifetime_public_transactions
, SUM(CASE WHEN DATEDIFF(proposal.delivery_date, project.done_on) > -1 THEN 1 ELSE 0 END) AS on_time_completed_jobs
, SUM(CASE WHEN DATEDIFF(proposal.delivery_date, project.done_on) < 0 THEN 1 ELSE 0 END) AS late_completed_jobs
, AVG(DATEDIFF(project.done_on, proposal.accepted_on)) AS average_days_job_completion
, SUM(CASE WHEN project.status = 8 THEN 1 ELSE 0 END) AS in_progress_jobs
, MIN(proposal.accepted_on) AS initial_transaction
, MAX(proposal.accepted_on) AS last_transaction
, ROUND(AVG(proposal.amount + proposal.shipping),2) AS average_gross_transaction_value
, ROUND(SUM(proposal.amount + proposal.shipping),2) AS lifetime_gross_transaction_value
, ROUND(SUM(CASE WHEN project.job_type = 1 THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS lifetime_private_gross_transaction_value
, ROUND(SUM(CASE WHEN project.job_type = 2 THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS lifetime_public_gross_transaction_value
, ROUND(SUM(CASE WHEN proposal.accepted_on > '2014-01-01' THEN proposal.amount + proposal.shipping ELSE 0 END),2) AS 2014_gross_transaction_value
, ROUND(AVG(CASE WHEN proposal.accepted_on > '2014-01-01' THEN (proposal.amount + proposal.shipping) ELSE 0 END),2) AS 2014_average_gross_transaction_value
, COUNT(DISTINCT(review.id)) AS review_count
, AVG(review.rating*1.00000) AS average_review_score
, MIN(proposal.delivery_date) AS first_delivery
, MAX(proposal.delivery_date) AS last_delivery
FROM
tracking_affiliatelead AS project
LEFT JOIN marketplace_partnerlead AS request ON request.id = project.affiliate_body_id
LEFT JOIN project_proposals AS proposal ON proposal.project_id = project.id
LEFT JOIN jobboard_review as review ON review.project_id = project.id
WHERE
proposal.accepted_on IS NOT NULL
AND project.bi_duplicate_source IS NULL
AND project.status NOT IN (1,7)
GROUP BY
maker_id
persist_for: 60 minutes
fields:
- dimension: maker_id
type: int
primary_key: true
hidden: true
- dimension: average_review_score
type: number
sql: ${TABLE}.average_review_score
- dimension: average_review_score_tiered
type: tier
sql: ${TABLE}.average_review_score
- dimension: lifetime_transactions
type: number
- dimension: 2014_transactions
type: number
sql: ${TABLE}.2014_transactions
- dimension: lifetime_private_transactions
type: number
- dimension: lifetime_public_transactions
type: number
- dimension: on_time_completed_jobs
type: int
hidden: true
- dimension: average_days_job_completion
type: number
sql: ${TABLE}.average_days_job_completion
- dimension: in_progress_jobs
type: int
- dimension: lifetime_transactions_tiered
type: tier
sql: ${lifetime_transactions}
- dimension: lifetime_transactions_tiered2
type: tier
sql: ${lifetime_transactions}
- dimension: 2014_gross_transaction_value
type: number
- dimension: average_gross_transaction_value
type: number
- dimension: 2014_average_gross_transaction_value
type: number
- dimension: lifetime_gross_transaction_value
type: number
- dimension: lifetime_gross_transaction_value_tiered
type: tier
sql: ${lifetime_gross_transaction_value}
- dimension: review_count
type: int
- dimension: lifetime_project_on_time_completion_percentage
type: number
sql: 100.00 * ${TABLE}.on_time_completed_jobs/(${TABLE}.on_time_completed_jobs + ${TABLE}.late_completed_jobs)
- dimension_group: initial_transaction
type: time
timeframes:
- time
- date
- week
- month
sql: ${TABLE}.initial_transaction
- dimension_group: last_transaction
type: time
timeframes:
- date
- week
- month
sql: ${TABLE}.last_transaction
- dimension_group: first_scheduled_delivery
type: time
timeframes:
- date
- week
- month
sql: ${TABLE}.first_delivery
- measure: total_2014_gross_transaction_value
type: sum
sql: ${2014_gross_transaction_value}
- measure: total_lifetime_gross_transaction_value
type: sum
sql: ${lifetime_gross_transaction_value}
- measure: percentage_of_projects_reviewed
type: number
sql: 100.00 * ${review_count}/${lifetime_transactions}
Contents
- transaction_facts.sql
- transaction_facts.sql
- transaction_facts.view.lkml
- transaction_facts.view.lookml