diff --git a/README.md b/README.md index 9e47e071..fd50c867 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,7 @@ Check [dbt Hub](https://hub.getdbt.com/dbt-labs/dbt_utils/latest/) for the lates - [generate_series](#generate_series-source) - [surrogate_key](#surrogate_key-source) - [safe_add](#safe_add-source) + - [safe_divide](#safe_divide-source) - [pivot](#pivot-source) - [unpivot](#unpivot-source) - [width_bucket](#width_bucket-source) @@ -1024,6 +1025,21 @@ Implements a cross-database way to sum nullable fields using the fields specifie {{ dbt_utils.safe_add('field_a', 'field_b'[,...]) }} ``` +#### safe_divide ([source](macros/cross_db_utils/safe_divide.sql)) + +This macro performs division but returns null if the denominator is 0. + +**Args:** + +- `numerator` (required): The number you want to divide. +- `denominator` (required): The number you want to divide by. + +**Usage:** + +``` +{{ dbt_utils.safe_divide('numerator', 'denominator') }} +``` + #### pivot ([source](macros/sql/pivot.sql)) This macro pivots values from rows to columns. diff --git a/integration_tests/data/sql/data_safe_divide.csv b/integration_tests/data/sql/data_safe_divide.csv new file mode 100644 index 00000000..aec2ee1d --- /dev/null +++ b/integration_tests/data/sql/data_safe_divide.csv @@ -0,0 +1,9 @@ +numerator,denominator,output +6,0, +10,5,2 +,, +,0, +17,, +0,, +,9, +0,5,0 \ No newline at end of file diff --git a/integration_tests/models/sql/schema.yml b/integration_tests/models/sql/schema.yml index d46d9283..3fc685fe 100644 --- a/integration_tests/models/sql/schema.yml +++ b/integration_tests/models/sql/schema.yml @@ -91,6 +91,12 @@ models: actual: actual expected: expected + - name: test_safe_divide + tests: + - assert_equal: + actual: actual + expected: expected + - name: test_pivot tests: - dbt_utils.equality: diff --git a/integration_tests/models/sql/test_safe_divide.sql b/integration_tests/models/sql/test_safe_divide.sql new file mode 100644 index 00000000..da5aeb0c --- /dev/null +++ b/integration_tests/models/sql/test_safe_divide.sql @@ -0,0 +1,12 @@ + +with data as ( + + select * from {{ ref('data_safe_divide') }} + +) + +select + {{ dbt_utils.safe_divide('numerator', 'denominator') }} as actual, + output as expected + +from data \ No newline at end of file diff --git a/macros/sql/safe_divide.sql b/macros/sql/safe_divide.sql new file mode 100644 index 00000000..ab3dfb94 --- /dev/null +++ b/macros/sql/safe_divide.sql @@ -0,0 +1,7 @@ +{% macro safe_divide(numerator, denominator) -%} + {{ return(adapter.dispatch('safe_divide', 'dbt_utils')(numerator, denominator)) }} +{%- endmacro %} + +{% macro default__safe_divide(numerator, denominator) %} + {{ numerator }} / nullif( {{ denominator }}, 0) +{% endmacro %} \ No newline at end of file