From 71e6e82c0f1fa6abb16f6a35944c506c09d254c6 Mon Sep 17 00:00:00 2001 From: Ananz2022 Date: Mon, 31 Mar 2025 18:02:57 -0400 Subject: [PATCH 1/2] handle empty values in pivot, get_query, get_query_results_as_dict and get_column_values macros --- macros/sql/get_column_values.sql | 7 ++-- macros/sql/get_query_results_as_dict.sql | 9 ++++- macros/sql/pivot.sql | 44 +++++++++++++++--------- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/macros/sql/get_column_values.sql b/macros/sql/get_column_values.sql index d1dcf5d4..3aa84c03 100644 --- a/macros/sql/get_column_values.sql +++ b/macros/sql/get_column_values.sql @@ -13,8 +13,11 @@ {# Not all relations are tables. Renaming for internal clarity without breaking functionality for anyone using named arguments #} {# TODO: Change the method signature in a future 0.x.0 release #} - {%- set target_relation = table -%} - + {%- set target_relation = table -%} + {% if table is string %} + {{ log("target_relation" ~ target_relation ~ "is not in the valid database.schema.table format. Returning the default value: " ~ default, info=True) }} + {{ return(default) }} + {% endif %} {# adapter.load_relation is a convenience wrapper to avoid building a Relation when we already have one #} {% set relation_exists = (load_relation(target_relation)) is not none %} diff --git a/macros/sql/get_query_results_as_dict.sql b/macros/sql/get_query_results_as_dict.sql index 6548f2dd..ea6e455c 100644 --- a/macros/sql/get_query_results_as_dict.sql +++ b/macros/sql/get_query_results_as_dict.sql @@ -17,7 +17,14 @@ {%- if execute -%} {% set sql_results_table = load_result('get_query_results').table.columns %} {% for column_name, column in sql_results_table.items() %} - {% do sql_results.update({column_name: column.values()}) %} + {% if column.values() %} + {% do sql_results.update({column_name: column.values()}) %} + {% else %} + {# If column is empty, assign a dummy value#} + {% do sql_results.update({column_name: ' '}) %} + {{ log('Column ' ~ column_name ~ ' has no values. Assigning empty value', info=True) }} + {% endif %} + {% endfor %} {%- endif -%} diff --git a/macros/sql/pivot.sql b/macros/sql/pivot.sql index 3eabc727..4cdb667c 100644 --- a/macros/sql/pivot.sql +++ b/macros/sql/pivot.sql @@ -65,22 +65,32 @@ Arguments: else_value=0, quote_identifiers=True, distinct=False) %} - {% for value in values %} - {{ agg }}( - {% if distinct %} distinct {% endif %} - case - when {{ column }} {{ cmp }} '{{ dbt.escape_single_quotes(value) }}' - then {{ then_value }} - else {{ else_value }} - end - ) - {% if alias %} - {% if quote_identifiers %} - as {{ adapter.quote(prefix ~ value ~ suffix) }} - {% else %} - as {{ dbt_utils.slugify(prefix ~ value ~ suffix) }} + + {# Check if values are empty or None #} + {% if values is none or values == [] %} + {{ log('Pivot: No values to pivot. Creating an empty column with the default then_value.', info=True) }} + {% set empty_column = prefix ~ 'empty' ~ suffix %} + {{ then_value }} as {{ adapter.quote(empty_column) }} + + {% else %} + {# Regular pivot behavior with provided values #} + {% for value in values %} + {{ agg }}( + {% if distinct %} distinct {% endif %} + case + when {{ column }} {{ cmp }} '{{ dbt.escape_single_quotes(value) }}' + then {{ then_value }} + else {{ else_value }} + end + ) + {% if alias %} + {% if quote_identifiers %} + as {{ adapter.quote(prefix ~ value ~ suffix) }} + {% else %} + as {{ dbt_utils.slugify(prefix ~ value ~ suffix) }} + {% endif %} {% endif %} - {% endif %} - {% if not loop.last %},{% endif %} - {% endfor %} + {% if not loop.last %},{% endif %} + {% endfor %} + {% endif %} {% endmacro %} From 67c041aa9d8f26ce0b2a6df3607220847b54f692 Mon Sep 17 00:00:00 2001 From: Doug Beatty <44704949+dbeatty10@users.noreply.github.com> Date: Thu, 3 Apr 2025 17:27:30 -0600 Subject: [PATCH 2/2] Remove changes to other macros --- macros/sql/get_column_values.sql | 7 ++----- macros/sql/get_query_results_as_dict.sql | 9 +-------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/macros/sql/get_column_values.sql b/macros/sql/get_column_values.sql index 3aa84c03..d1dcf5d4 100644 --- a/macros/sql/get_column_values.sql +++ b/macros/sql/get_column_values.sql @@ -13,11 +13,8 @@ {# Not all relations are tables. Renaming for internal clarity without breaking functionality for anyone using named arguments #} {# TODO: Change the method signature in a future 0.x.0 release #} - {%- set target_relation = table -%} - {% if table is string %} - {{ log("target_relation" ~ target_relation ~ "is not in the valid database.schema.table format. Returning the default value: " ~ default, info=True) }} - {{ return(default) }} - {% endif %} + {%- set target_relation = table -%} + {# adapter.load_relation is a convenience wrapper to avoid building a Relation when we already have one #} {% set relation_exists = (load_relation(target_relation)) is not none %} diff --git a/macros/sql/get_query_results_as_dict.sql b/macros/sql/get_query_results_as_dict.sql index ea6e455c..6548f2dd 100644 --- a/macros/sql/get_query_results_as_dict.sql +++ b/macros/sql/get_query_results_as_dict.sql @@ -17,14 +17,7 @@ {%- if execute -%} {% set sql_results_table = load_result('get_query_results').table.columns %} {% for column_name, column in sql_results_table.items() %} - {% if column.values() %} - {% do sql_results.update({column_name: column.values()}) %} - {% else %} - {# If column is empty, assign a dummy value#} - {% do sql_results.update({column_name: ' '}) %} - {{ log('Column ' ~ column_name ~ ' has no values. Assigning empty value', info=True) }} - {% endif %} - + {% do sql_results.update({column_name: column.values()}) %} {% endfor %} {%- endif -%}