LEARN

Using CASE WHEN Statements in Snowflake

A detailed guide on using CASE WHEN statements in Snowflake, including nested conditions, handling nulls, and conditional aggregation.

Archie Sarre Wood
Archie Sarre Wood

What is a CASE WHEN Statement in Snowflake?

The CASE WHEN statement in Snowflake allows you to perform conditional logic directly in SQL queries. It works similarly to IF-ELSE statements found in other programming languages, enabling complex conditional expressions and aggregations.

Basic Syntax for CASE WHEN in Snowflake

CASE
  WHEN condition THEN result
  [WHEN ... THEN ...]
  [ELSE default_result]
END
  • condition: Logical condition to evaluate.
  • result: Value to return if the condition is true.
  • ELSE: Optional value returned if no conditions are true.

CASE WHEN Example

Here’s a simple example to categorize sales:

SELECT
  product,
  sales,
  CASE
    WHEN sales >= 1000 THEN 'High'
    WHEN sales >= 500 THEN 'Medium'
    ELSE 'Low'
  END AS sales_category
FROM products;

CASE WHEN with Multiple Conditions

You can combine multiple conditions with logical operators (AND, OR):

SELECT
  customer_id,
  CASE
    WHEN status = 'Active' AND balance > 0 THEN 'In Good Standing'
    WHEN status = 'Inactive' OR balance <= 0 THEN 'Review Needed'
    ELSE 'Unknown'
  END AS account_status
FROM customers;

Handling NULL Values with CASE WHEN

Use the CASE statement to handle NULL values explicitly:

SELECT
  employee_id,
  CASE
    WHEN department IS NULL THEN 'Unassigned'
    ELSE department
  END AS department_status
FROM employees;

Nested CASE WHEN Statements

For more complex logic, use nested CASE statements:

SELECT
  student_id,
  CASE
    WHEN score IS NULL THEN 'No Score'
    ELSE CASE
      WHEN score >= 90 THEN 'A'
      WHEN score >= 80 THEN 'B'
      WHEN score >= 70 THEN 'C'
      ELSE 'F'
    END
  END AS grade
FROM exams;

Using CASE WHEN with Aggregation (SUM)

Aggregate conditionally using SUM with CASE WHEN:

SELECT
  region,
  SUM(CASE WHEN status = 'Closed' THEN 1 ELSE 0 END) AS closed_count,
  SUM(CASE WHEN status = 'Open' THEN 1 ELSE 0 END) AS open_count
FROM cases
GROUP BY region;

This provides a count of cases by status per region.

CASE WHEN ELSE

Using ELSE provides a default result:

SELECT
  order_id,
  CASE
    WHEN delivery_date IS NULL THEN 'Pending'
    ELSE 'Delivered'
  END AS delivery_status
FROM orders;

Conditional Aggregation: SUM CASE WHEN

Summing values conditionally:

SELECT
  salesperson,
  SUM(CASE WHEN quarter = 'Q1' THEN revenue ELSE 0 END) AS q1_revenue,
  SUM(CASE WHEN quarter = 'Q2' THEN revenue ELSE 0 END) AS q2_revenue
FROM sales
GROUP BY salesperson;

This pivot-like functionality helps create insightful summaries.

Conclusion

  • CASE WHEN statements are powerful for conditional logic.
  • Support complex conditions, handling of NULLs, nested statements, and conditional aggregations.
  • Essential for data transformations, categorization, and reporting.

For more details, refer to Snowflake’s official documentation.

Get Started with Evidence

Build performant data apps using SQL and markdown

Join industry leaders version controlling their reporting layer

Start Free Trial →