📖 Scenario: You work as a data analyst using dbt to transform sales data. You want to create a model that filters sales records based on a minimum sales amount set by a variable. This helps you focus on important sales only.
🎯 Goal: Build a dbt model that uses a variable to set a sales threshold and applies control flow to filter sales records with amounts greater than or equal to that threshold.
📋 What You'll Learn
Create a variable called min_sales with the value 1000 in the dbt model.
Use a config block to set the model materialization to table.
Write a SQL query that selects order_id and sales_amount from sales_data where sales_amount is greater than or equal to the min_sales variable.
Use Jinja control flow to apply the filter condition based on the variable.
💡 Why This Matters
🌍 Real World
In real projects, analysts use variables and control flow in dbt to create dynamic models that adapt to different business needs without rewriting SQL.
💼 Career
Understanding variables and control flow in dbt is essential for data engineers and analysts to build maintainable and flexible data transformation pipelines.
Progress0 / 4 steps
1
Set up the sales data source
Create a dbt model SQL file with a select statement that selects order_id and sales_amount from the table sales_data. This is the base query before filtering.
dbt
Hint
This is the starting point. Just select the columns from the table.
2
Add a variable for minimum sales threshold
Add a Jinja variable called min_sales and set it to 1000 at the top of the model file.
dbt
Hint
Use Jinja syntax to create the variable before the SQL query.
3
Apply control flow to filter sales by the variable
Use a Jinja if statement to add a where clause that filters sales_amount to be greater than or equal to min_sales. The where clause should only appear if min_sales is set.
dbt
Hint
Use Jinja control flow to conditionally add the filter based on the variable.
4
Add model configuration and print the final query
Add a config block at the top to set materialized='table'. Then print the full SQL query as the model output.
dbt
Hint
Use the config Jinja block to set the model materialization.
Practice
(1/5)
1. What does the {% set %} statement do in dbt?
easy
A. It deletes a table from the database.
B. It runs a SQL query directly.
C. It defines a new model in dbt.
D. It creates a variable to store a value for reuse.
Solution
Step 1: Understand the purpose of {% set %}
The {% set %} statement in dbt is used to create a variable that holds a value.
Step 2: Identify its use in code reuse
This variable can then be reused multiple times in your dbt project, making code cleaner and easier to maintain.
Final Answer:
It creates a variable to store a value for reuse. -> Option D
Quick Check:
{% set %} creates variables [OK]
Hint: Remember: {% set %} means 'store this value' [OK]
Common Mistakes:
Thinking {% set %} runs SQL directly
Confusing it with model creation
Assuming it deletes data
2. Which of the following is the correct syntax to create a variable named my_var with value 10 in dbt?
easy
A. {% set my_var = 10 %}
B. {% var my_var = 10 %}
C. {{ set my_var = 10 }}
D. {% set 'my_var' = 10 %}
Solution
Step 1: Recall dbt variable syntax
In dbt, variables are created using the Jinja syntax: {% set variable_name = value %}.
Step 2: Check each option
{% set my_var = 10 %} matches the correct syntax exactly. Options B and C use wrong keywords or delimiters. {% set 'my_var' = 10 %} incorrectly quotes the variable name.
Final Answer:
{% set my_var = 10 %} -> Option A
Quick Check:
Correct variable syntax uses {% set %} [OK]
Hint: Use {% set var = value %} without quotes around var [OK]
Common Mistakes:
Using {{ }} instead of {% %} for setting variables
Quoting variable names incorrectly
Using wrong keywords like var
3. Given the following dbt code snippet, what will be the output of {{ greeting }}?
{% set hour = 15 %}
{% if hour < 12 %}
{% set greeting = 'Good morning' %}
{% elif hour < 18 %}
{% set greeting = 'Good afternoon' %}
{% else %}
{% set greeting = 'Good evening' %}
{% endif %}
{{ greeting }}
medium
A. Good morning
B. Good evening
C. Good afternoon
D. No output (error)
Solution
Step 1: Evaluate the value of hour
The variable hour is set to 15.
Step 2: Check the if-elif-else conditions
Since 15 is not less than 12, the first condition fails. It is less than 18, so the second condition is true, setting greeting to 'Good afternoon'.
Final Answer:
Good afternoon -> Option C
Quick Check:
15 < 18 -> 'Good afternoon' [OK]
Hint: Check conditions in order; first true branch runs [OK]
Common Mistakes:
Assuming hour 15 is morning
Ignoring elif and jumping to else
Thinking variable is undefined
4. Identify the error in this dbt snippet:
{% set total = 0 %}
{% for i in range(3) %}
{% set total = total + i %}
{% endfor %}
{{ total }}
medium
A. The range function is not available in dbt Jinja.
B. Variables cannot be updated inside a loop.
C. The loop syntax is incorrect; missing parentheses.
D. The variable total should be declared with var.
Solution
Step 1: Understand Jinja in dbt limitations
dbt uses Jinja templating, which does not support Python's range() function directly.
Step 2: Identify the error cause
Using range(3) will cause an error because range is undefined in this context.
Final Answer:
The range function is not available in dbt Jinja. -> Option A
Quick Check:
No range() in dbt Jinja [OK]
Hint: Remember: Jinja loops use lists, not Python range() [OK]
Common Mistakes:
Assuming Python functions work in Jinja
Trying to update variables inside loops without workarounds
Using wrong loop syntax
5. You want to create a dbt model that uses a variable env to switch between two schemas: dev_schema if env is 'dev', else prod_schema. Which code snippet correctly implements this control flow?
hard
A. {% set schema = 'dev_schema' if env == 'dev' else 'prod_schema' %}
SELECT * FROM {{ schema }}.my_table
B. {% if env == 'dev' %}
{% set schema = 'dev_schema' %}
{% else %}
{% set schema = 'prod_schema' %}
{% endif %}
SELECT * FROM {{ schema }}.my_table
C. {% set schema = env == 'dev' and 'dev_schema' or 'prod_schema' %}
SELECT * FROM {{ schema }}.my_table
D. {% set schema = 'prod_schema' %}
{% if env == 'dev' %}
{% set schema = 'dev_schema' %}
SELECT * FROM {{ schema }}.my_table
Solution
Step 1: Understand conditional variable assignment in dbt
dbt supports control flow with {% if %} and {% else %} blocks to set variables based on conditions.
Step 2: Check each option for correctness
{% if env == 'dev' %}
{% set schema = 'dev_schema' %}
{% else %}
{% set schema = 'prod_schema' %}
{% endif %}
SELECT * FROM {{ schema }}.my_table uses proper if-else blocks to set schema correctly before using it in the query. {% set schema = 'dev_schema' if env == 'dev' else 'prod_schema' %}
SELECT * FROM {{ schema }}.my_table uses Python-style inline if which is not supported in Jinja. {% set schema = env == 'dev' and 'dev_schema' or 'prod_schema' %}
SELECT * FROM {{ schema }}.my_table uses a Python boolean expression which is not valid in Jinja. {% set schema = 'prod_schema' %}
{% if env == 'dev' %}
{% set schema = 'dev_schema' %}
SELECT * FROM {{ schema }}.my_table sets schema first then tries to reset inside if but the query is inside the if block, causing scope issues.
Final Answer:
Option B correctly uses if-else to set schema and then queries it. -> Option B
Quick Check:
Use {% if %}...{% else %}...{% endif %} for control flow [OK]
Hint: Use full if-else blocks to set variables, not inline Python [OK]
Common Mistakes:
Trying Python inline if syntax in Jinja
Placing SQL inside if blocks incorrectly
Not setting variable before using it
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.