SQL Mobile ticketing

Promoters With Inventory

Promoters With Inventory model for mobile ticketing.

source-preserved

Blocks

promoters_with_inventory.sql · 68 lines
inferred
-- models/promoters_with_inventory.sql
{{ config(materialized='view') }}

SELECT *
FROM sync_promoters
LEFT JOIN (
  SELECT
      _id as event_id
    , created_at as event_created_at
    , updated_at as event_updated_at
    , perm_name
    , name
    , card_fee
    , currency
    , venue
    , address
  FROM sync_events
) AS events
ON sync_promoters.owned_event_id = events.event_id
LEFT JOIN (
  SELECT
       perm_name as inventory_perm_name
     , max(artists) as artists
     , max(city) as city
     , max(price) as price
     , max(allocation) as allocation
     , sum(sold) as sold
     , sum(waitinglist) as waitinglist
     , sum(revenue) as revenue
     , sum(views) as views
     , sum(plays) as plays
     , sum(registrations) as registrations
     , max(off_sale) as event_date
FROM ts_inventory
GROUP BY perm_name
) AS inventory
ON events.perm_name = inventory.inventory_perm_name

# models/schema.yml
version: 2

models:
  - name: promoters_with_inventory
    columns:
      - name: _id
      - name: created_at
      - name: updated_at
      - name: first_name
      - name: last_name
      - name: email
      - name: owned_event_id
      - name: event_id
      - name: event_created_at
      - name: perm_name
      - name: name
      - name: venue
      - name: card_fee
      - name: currency
      - name: price
      - name: artists
      - name: city
      - name: allocation
      - name: waitinglist
      - name: revenue
      - name: sold
      - name: plays
      - name: registrations
      - name: event_date

Assumptions

  • materialized='view' is the default; no persist hint found.
  • schema.yml columns come from view dimensions; a primary_key dimension gets unique + not_null tests.
promoters_with_inventory.sql · 34 lines
source-preserved validation: parses
SELECT *
FROM sync_promoters
LEFT JOIN (
  SELECT
      _id as event_id
    , created_at as event_created_at
    , updated_at as event_updated_at
    , perm_name
    , name
    , card_fee
    , currency
    , venue
    , address
  FROM sync_events
) AS events
ON sync_promoters.owned_event_id = events.event_id
LEFT JOIN (
  SELECT
       perm_name as inventory_perm_name
     , max(artists) as artists
     , max(city) as city
     , max(price) as price
     , max(allocation) as allocation
     , sum(sold) as sold
     , sum(waitinglist) as waitinglist
     , sum(revenue) as revenue
     , sum(views) as views
     , sum(plays) as plays
     , sum(registrations) as registrations
     , max(off_sale) as event_date
FROM ts_inventory
GROUP BY perm_name
) AS inventory
ON events.perm_name = inventory.inventory_perm_name
promoters_with_inventory.view.lkml · 177 lines
inferred
view: promoters_with_inventory {
  derived_table: {
    sql: SELECT *
FROM sync_promoters
LEFT JOIN (
  SELECT
      _id as event_id
    , created_at as event_created_at
    , updated_at as event_updated_at
    , perm_name
    , name
    , card_fee
    , currency
    , venue
    , address
  FROM sync_events
) AS events
ON sync_promoters.owned_event_id = events.event_id
LEFT JOIN (
  SELECT
       perm_name as inventory_perm_name
     , max(artists) as artists
     , max(city) as city
     , max(price) as price
     , max(allocation) as allocation
     , sum(sold) as sold
     , sum(waitinglist) as waitinglist
     , sum(revenue) as revenue
     , sum(views) as views
     , sum(plays) as plays
     , sum(registrations) as registrations
     , max(off_sale) as event_date
FROM ts_inventory
GROUP BY perm_name
) AS inventory
ON events.perm_name = inventory.inventory_perm_name ;;
  }

  dimension: _id {
    type: string
    hidden: yes
    sql: ${TABLE}._id ;;
  }

  dimension: created_at {
    type: time
    sql: ${TABLE}.created_at ;;
  }

  dimension: updated_at {
    type: time
    sql: ${TABLE}.updated_at ;;
  }

  dimension: first_name {
    type: string
    sql: ${TABLE}.first_name ;;
  }

  dimension: last_name {
    type: string
    sql: ${TABLE}.last_name ;;
  }

  dimension: email {
    type: string
    sql: ${TABLE}.email ;;
  }

  dimension: owned_event_id {
    type: string
    sql: ${TABLE}.owned_event_id ;;
  }

  dimension: event_id {
    type: string
    hidden: yes
    sql: ${TABLE}.event_id ;;
  }

  dimension: event_created_at {
    type: time
    sql: ${TABLE}.event_created_at ;;
  }

  dimension: perm_name {
    type: string
    sql: ${TABLE}.perm_name ;;
  }

  dimension: name {
    label: "Event Name"
    type: string
    sql: ${TABLE}.name ;;
  }

  dimension: venue {
    type: string
    sql: ${TABLE}.venue ;;
  }

  dimension: card_fee {
    type: number
    sql: ${TABLE} card_fee ;;
  }

  dimension: currency {
    type: number
    sql: ${TABLE}.currency ;;
  }

  dimension: price {
    type: number
    value_format: "\"£\"0.00"
    sql: ${TABLE}.price ;;
  }

  dimension: artists {
    type: string
    sql: ${TABLE}.artists ;;
  }

  dimension: city {
    type: string
    sql: ${TABLE}.city ;;
  }

  dimension: allocation {
    type: number
    sql: ${TABLE}.allocation ;;
  }

  dimension: waitinglist {
    type: number
    sql: ${TABLE}.waitinglist ;;
  }

  dimension: revenue {
    type: number
    hidden: yes
    value_format: "\"£\"#,##0"
    sql: ${TABLE}.revenue ;;
  }

  dimension: sold {
    type: number
    hidden: yes
    sql: ${TABLE}.sold ;;
  }

  dimension: plays {
    type: number
    sql: ${TABLE}.plays ;;
  }

  dimension: registrations {
    type: number
    sql: ${TABLE}.registrations ;;
  }

  dimension: event_date {
    type: date
    sql: ${TABLE}.event_date ;;
  }

  measure: tickets_sold {
    type: number
    value_format: "#,##0"
    sql: ${TABLE}.sold ;;
  }

  measure: ticket_revenue {
    type: number
    value_format: "$#,##0"
    sql: ${TABLE}.revenue ;;
  }
}
promoters_with_inventory.view.lookml · 124 lines
source-preserved
- view: promoters_with_inventory
  derived_table:
    sql: SELECT *
FROM sync_promoters
LEFT JOIN (
  SELECT
      _id as event_id
    , created_at as event_created_at
    , updated_at as event_updated_at
    , perm_name
    , name
    , card_fee
    , currency
    , venue
    , address
  FROM sync_events
) AS events
ON sync_promoters.owned_event_id = events.event_id
LEFT JOIN (
  SELECT
       perm_name as inventory_perm_name
     , max(artists) as artists
     , max(city) as city
     , max(price) as price
     , max(allocation) as allocation
     , sum(sold) as sold
     , sum(waitinglist) as waitinglist
     , sum(revenue) as revenue
     , sum(views) as views
     , sum(plays) as plays
     , sum(registrations) as registrations
     , max(off_sale) as event_date
FROM ts_inventory
GROUP BY perm_name
) AS inventory
ON events.perm_name = inventory.inventory_perm_name
  fields:
  - dimension: _id
    type: string
    hidden: true
    sql: ${TABLE}._id
  - dimension: created_at
    type: time
    sql: ${TABLE}.created_at
  - dimension: updated_at
    type: time
    sql: ${TABLE}.updated_at
  - dimension: first_name
    type: string
    sql: ${TABLE}.first_name
  - dimension: last_name
    type: string
    sql: ${TABLE}.last_name
  - dimension: email
    type: string
    sql: ${TABLE}.email
  - dimension: owned_event_id
    type: string
    sql: ${TABLE}.owned_event_id
  - dimension: event_id
    type: string
    hidden: true
    sql: ${TABLE}.event_id
  - dimension: event_created_at
    type: time
    sql: ${TABLE}.event_created_at
  - dimension: perm_name
    type: string
    sql: ${TABLE}.perm_name
  - dimension: name
    type: string
    label: Event Name
    sql: ${TABLE}.name
  - dimension: venue
    type: string
    sql: ${TABLE}.venue
  - dimension: card_fee
    type: number
    sql: ${TABLE} card_fee
  - dimension: currency
    type: number
    sql: ${TABLE}.currency
  - dimension: price
    type: number
    value_format: '"£"0.00'
    sql: ${TABLE}.price
  - dimension: artists
    type: string
    sql: ${TABLE}.artists
  - dimension: city
    type: string
    sql: ${TABLE}.city
  - dimension: allocation
    type: number
    sql: ${TABLE}.allocation
  - dimension: waitinglist
    type: number
    sql: ${TABLE}.waitinglist
  - dimension: revenue
    type: number
    hidden: true
    value_format: '"£"#,##0'
    sql: ${TABLE}.revenue
  - dimension: sold
    type: number
    hidden: true
    sql: ${TABLE}.sold
  - dimension: plays
    type: number
    sql: ${TABLE}.plays
  - dimension: registrations
    type: number
    sql: ${TABLE}.registrations
  - dimension: event_date
    type: date
    sql: ${TABLE}.event_date
  - measure: tickets_sold
    type: number
    value_format: '#,##0'
    sql: ${TABLE}.sold
  - measure: ticket_revenue
    type: number
    value_format: '$#,##0'
    sql: ${TABLE}.revenue

Contents

  • promoters_with_inventory.sql
  • promoters_with_inventory.sql
  • promoters_with_inventory.view.lkml
  • promoters_with_inventory.view.lookml