Build with AnnE, or from your own code. The MCP server, the REST API and GitHub - every job is also files you can review.

Developers · dbt macros

Formulas that run as dbt macros

Write a rule once, in Excel words. It cleans records as they move through a process, and the same rule becomes a dbt macro in the SQL of every warehouse - Snowflake, BigQuery, Databricks, Redshift, Postgres, SQL Server, Oracle and MySQL. Pick one to see the formula, the engine's answer, the dbt call and the SQL for each warehouse; how it all fits together is below.

SimpleContacts

CleanPhone

Strips spaces and dashes from a phone number.

The formulaCleanPhone(phone) =SUBSTITUTE(TRIM(phone), "-", "")
On
phone = " 555-0134 "
Result from the formula engine
"5550134"
In a dbt model{{ CleanPhone('phone') }}
The macro, as the engine writes it for each warehouse
Snowflake
REPLACE(TRIM({{ phone }}), '-', '')
BigQuery
REPLACE(TRIM({{ phone }}), '-', '')
Databricks
REPLACE(TRIM({{ phone }}), '-', '')
Redshift
REPLACE(TRIM({{ phone }}), '-', '')
Postgres
REPLACE(TRIM({{ phone }}), '-', '')
SQL Server, Azure SQL, Synapse, Fabric
REPLACE(TRIM({{ phone }}), '-', '')
Oracle
REPLACE(TRIM({{ phone }}), '-', '')
MySQL
REPLACE(TRIM({{ phone }}), '-', '')

One rule, written once

  1. Maya writes it. Maya Brooks runs operations at Harbor Lane Outfitters. Phone numbers arrive as (415) 555-0134, 415.555.0134 and 1-415-555-0134, and the CRM is full of duplicates. On her job’s Formulas tab she writes one rule, gives it an example, and the engine checks it on every save:
    PhoneDigits(phone) =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TRIM(phone), "(", ""), ")", ""), "-", ""), " ", ""), ".", "")
  2. It cleans orders in flight. Her order process calls =PhoneDigits(customer.phone) in a mapping step, so every order is clean before it reaches the CRM.
  3. Daniel uses the same rule in dbt. Daniel Reyes builds the reporting models in Snowflake with dbt. A Run dbt step in the same job carries the job’s formulas as macros/dai_formulas.sql, written for Snowflake when the process is saved. His model says {{ PhoneDigits('phone') }}, and Snowflake runs:
    REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TRIM(phone), '(', ''), ')', ''), '-', ''), ' ', ''), '.', '')
  4. The acquisition lands on Databricks. The same formula is written as Databricks SQL by the same engine. Nobody rewrites it, and nobody has to remember that the two copies must stay in step.
  5. One change, everywhere. When Maya adds a rule for extensions, her examples run again, the formula’s usage shows every process step and model column that depends on it, and the next save writes the new macro. A published version keeps the macros it was published with; promoting the job to Test and Production carries the formula with it.

Checked, not typed

  • Every result below is the formula engine’s answer on the sample shown, and every line of SQL is what the engine writes - nothing is hand-typed.
  • 250 of 250 run in Postgres on October 8, 2026 gave the engine’s answer exactly.
  • 250 of 250 run in Snowflake on October 8, 2026 gave the engine’s answer exactly.
  • 250 of 250 run in Databricks on October 8, 2026 gave the engine’s answer exactly.
  • 250 of 250 run in BigQuery on October 8, 2026 gave the engine’s answer exactly.
  • 250 of 250 run in Redshift on October 8, 2026 gave the engine’s answer exactly.
  • 250 of 250 run in a Microsoft Fabric Warehouse on October 8, 2026 gave the engine’s answer exactly.
  • 250 of 250 run in Oracle Database 23ai Free on October 8, 2026 gave the engine’s answer exactly.
  • 250 of 250 run in MySQL 8.4 on October 8, 2026 gave the engine’s answer exactly.

How dbt projects use them

  1. As a column

    The everyday use: a cleaned or derived column in a model.

    select
        order_id,
        {{ PhoneDigits('phone') }} as phone,
        {{ OrderSize('total') }} as order_size
    from {{ ref('stg_orders') }}
  2. In a filter

    A true/false macro is a WHERE clause.

    select *
    from {{ ref('stg_payments') }}
    where {{ IsPaid('status') }}
      and not {{ IsInternalEmail('email') }}
  3. To group by

    Buckets and labels become report dimensions.

    select
        {{ AgingBucket('due_day', 'current_date') }} as bucket,
        sum(amount_due) as owed
    from {{ ref('invoices') }}
    group by 1
  4. As a join key

    Two systems agree on a person when both sides are normalized the same way.

    from {{ ref('shop_orders') }} o
    join {{ ref('crm_contacts') }} c
      on {{ NormalizeEmail('o.email') }} = {{ NormalizeEmail('c.email') }}
  5. As a data test

    A singular test fails on the rows the formula rejects.

    -- tests/assert_customer_emails_are_valid.sql
    select *
    from {{ ref('customers') }}
    where not ({{ IsValidEmail('email') }})
  6. Inside your own macros

    Formula macros compose with hand-written Jinja.

    {% macro customer_key(t) %}
      {{ CustomerKey(t ~ '.email', t ~ '.phone', t ~ '.first_name', t ~ '.last_name', t ~ '.zip') }}
    {% endmacro %}
  7. With literal arguments

    dbt passes SQL text: a constant carries its quotes.

    {{ SalesTax('subtotal', "'TX'") }} as tax,
    {{ TieredCommission('quarter_sales') }} as commission
  8. In incremental models

    An expression is an argument too - here, the warehouse's own date.

    {% if is_incremental() %}
    where {{ IsReturnWindowOpen('order_day', 'current_date') }}
    {% endif %}

Every warehouse, and its quirks

One formula, eight dialects. These are the places warehouses disagree - and what the engine writes for each.

Joining text Oracle's and Redshift's CONCAT take exactly two parts, so the engine joins with || there. And a formula joins a blank as empty text: Postgres, SQL Server and Oracle already do, the others answer blank for the whole join - so there each part is made text and a blank one empty.

Formula FullName: =TRIM(first) & " " & TRIM(last)

SnowflakeCONCAT(COALESCE(CAST(TRIM({{ first }}) AS VARCHAR), ''), ' ', COALESCE(CAST(TRIM({{ last }}) AS VARCHAR), ''))
BigQueryCONCAT(COALESCE(CAST(TRIM({{ first }}) AS STRING), ''), ' ', COALESCE(CAST(TRIM({{ last }}) AS STRING), ''))
DatabricksCONCAT(COALESCE(CAST(TRIM({{ first }}) AS STRING), ''), ' ', COALESCE(CAST(TRIM({{ last }}) AS STRING), ''))
Redshift(COALESCE(CAST(TRIM({{ first }}) AS VARCHAR), '') || ' ' || COALESCE(CAST(TRIM({{ last }}) AS VARCHAR), ''))
PostgresCONCAT(TRIM({{ first }}), ' ', TRIM({{ last }}))
SQL Server, Azure SQL, Synapse, FabricCONCAT(TRIM({{ first }}), ' ', TRIM({{ last }}))
Oracle(TRIM({{ first }}) || ' ' || TRIM({{ last }}))
MySQLCONCAT(COALESCE(CAST(TRIM({{ first }}) AS CHAR), ''), ' ', COALESCE(CAST(TRIM({{ last }}) AS CHAR), ''))
Taking part of text SUBSTRING or SUBSTR, LENGTH, LEN or CHAR_LENGTH, and Oracle has no LEFT at all - the engine writes each warehouse's own spelling.

Formula ProperName: =UPPER(LEFT(TRIM(name), 1)) & LOWER(MID(TRIM(name), 2, LEN(TRIM(name))))

SnowflakeCONCAT(COALESCE(CAST(UPPER(LEFT(TRIM({{ name }}), 1)) AS VARCHAR), ''), COALESCE(CAST(LOWER(SUBSTRING(TRIM({{ name }}), 2, LENGTH(TRIM({{ name }})))) AS VARCHAR), ''))
BigQueryCONCAT(COALESCE(CAST(UPPER(LEFT(TRIM({{ name }}), 1)) AS STRING), ''), COALESCE(CAST(LOWER(SUBSTR(TRIM({{ name }}), 2, LENGTH(TRIM({{ name }})))) AS STRING), ''))
DatabricksCONCAT(COALESCE(CAST(UPPER(LEFT(TRIM({{ name }}), 1)) AS STRING), ''), COALESCE(CAST(LOWER(SUBSTRING(TRIM({{ name }}), 2, LENGTH(TRIM({{ name }})))) AS STRING), ''))
Redshift(COALESCE(CAST(UPPER(LEFT(TRIM({{ name }}), 1)) AS VARCHAR), '') || COALESCE(CAST(LOWER(SUBSTRING(TRIM({{ name }}), 2, LENGTH(TRIM({{ name }})))) AS VARCHAR), ''))
PostgresCONCAT(UPPER(LEFT(TRIM({{ name }}), 1)), LOWER(SUBSTRING(TRIM({{ name }}), 2, LENGTH(TRIM({{ name }})))))
SQL Server, Azure SQL, Synapse, FabricCONCAT(UPPER(LEFT(TRIM({{ name }}), 1)), LOWER(SUBSTRING(TRIM({{ name }}), 2, LEN(TRIM({{ name }})))))
Oracle(UPPER(SUBSTR(TRIM({{ name }}), 1, 1)) || LOWER(SUBSTR(TRIM({{ name }}), 2, LENGTH(TRIM({{ name }})))))
MySQLCONCAT(COALESCE(CAST(UPPER(LEFT(TRIM({{ name }}), 1)) AS CHAR), ''), COALESCE(CAST(LOWER(SUBSTRING(TRIM({{ name }}), 2, CHAR_LENGTH(TRIM({{ name }})))) AS CHAR), ''))
Adding to a date Four spellings: DATEADD(day, n, d), DATE_ADD(d, INTERVAL n DAY), d + n * INTERVAL '1 day', and Oracle's NUMTODSINTERVAL.

Formula DueDate: =DATEADD(invoice_day, terms_days, "day")

SnowflakeDATEADD(day, {{ terms_days }}, {{ invoice_day }})
BigQueryDATE_ADD({{ invoice_day }}, INTERVAL {{ terms_days }} DAY)
DatabricksDATEADD(day, {{ terms_days }}, {{ invoice_day }})
Redshift({{ invoice_day }} + ({{ terms_days }}) * INTERVAL '1 day')
Postgres({{ invoice_day }} + ({{ terms_days }}) * INTERVAL '1 day')
SQL Server, Azure SQL, Synapse, FabricDATEADD(day, {{ terms_days }}, {{ invoice_day }})
Oracle({{ invoice_day }} + NUMTODSINTERVAL({{ terms_days }}, 'DAY'))
MySQLDATE_ADD({{ invoice_day }}, INTERVAL {{ terms_days }} DAY)
Text to a number NUMBER(38, 10), NUMERIC or DECIMAL(38, 10) - each warehouse's exact decimal, never a float that loses cents.

Formula ToNumber: =VALUE(TRIM(text))

SnowflakeCAST(TRIM({{ text }}) AS NUMBER(38, 10))
BigQueryCAST(TRIM({{ text }}) AS NUMERIC)
DatabricksCAST(TRIM({{ text }}) AS DECIMAL(38, 10))
RedshiftCAST(TRIM({{ text }}) AS DECIMAL(38, 10))
PostgresCAST(TRIM({{ text }}) AS NUMERIC)
SQL Server, Azure SQL, Synapse, FabricCAST(TRIM({{ text }}) AS DECIMAL(38, 10))
OracleCAST(TRIM({{ text }}) AS NUMBER)
MySQLCAST(TRIM({{ text }}) AS DECIMAL(38, 10))
Division A formula's / is exact division. Postgres, Redshift and SQL Server divide two whole numbers as whole numbers (12950 / 100 is 129); Databricks and BigQuery divide them as floating point, and Databricks keeps only six places of a decimal divided (0.065 / 12 is 0.005417) - enough to put a mortgage payment 7 cents out. The engine makes the left side an exact decimal in all five.

Formula CentsToDollars: =cents / 100

Snowflake{{ cents }} / 100
BigQueryCAST({{ cents }} AS BIGNUMERIC) / 100
DatabricksCAST({{ cents }} AS DECIMAL(38, 10)) / 100
RedshiftCAST({{ cents }} AS DECIMAL(38, 10)) / 100
PostgresCAST({{ cents }} AS NUMERIC) / 100
SQL Server, Azure SQL, Synapse, FabricCAST({{ cents }} AS DECIMAL(38, 10)) / 100
Oracle{{ cents }} / 100
MySQL{{ cents }} / 100
Written decimals BigQuery reads a number written with a decimal point, like 0.0725, as floating point, so 7.25% tax on $378 came out $27.40 instead of $27.41. The engine writes it as BIGNUMERIC '0.0725' there, exact like every other warehouse's decimal.

Formula InvoiceTotal: =ROUND(Discounted(subtotal, discount_pct) + SalesTax(Discounted(subtotal, discount_pct), state) + shipping, 2)

SnowflakeROUND((ROUND(({{ subtotal }}) * (1 - ({{ discount_pct }}) / 100), 2)) + (ROUND(((ROUND(({{ subtotal }}) * (1 - ({{ discount_pct }}) / 100), 2))) * CASE WHEN UPPER(({{ state }})) = 'CA' THEN 0.0725 WHEN UPPER(({{ state }})) = 'TX' THEN 0.0625 WHEN UPPER(({{ state }})) = 'NY' THEN 0.04 WHEN LOWER(UPPER(({{ state }}))) IN (LOWER('OR'), LOWER('MT'), LOWER('NH'), LOWER('DE')) THEN 0 ELSE 0.05 END, 2)) + {{ shipping }}, 2)
BigQueryROUND((ROUND(({{ subtotal }}) * (1 - CAST(({{ discount_pct }}) AS BIGNUMERIC) / 100), 2)) + (ROUND(((ROUND(({{ subtotal }}) * (1 - CAST(({{ discount_pct }}) AS BIGNUMERIC) / 100), 2))) * CASE WHEN UPPER(({{ state }})) = 'CA' THEN BIGNUMERIC '0.0725' WHEN UPPER(({{ state }})) = 'TX' THEN BIGNUMERIC '0.0625' WHEN UPPER(({{ state }})) = 'NY' THEN BIGNUMERIC '0.04' WHEN LOWER(UPPER(({{ state }}))) IN (LOWER('OR'), LOWER('MT'), LOWER('NH'), LOWER('DE')) THEN 0 ELSE BIGNUMERIC '0.05' END, 2)) + {{ shipping }}, 2)
DatabricksROUND((ROUND(({{ subtotal }}) * (1 - CAST(({{ discount_pct }}) AS DECIMAL(38, 10)) / 100), 2)) + (ROUND(((ROUND(({{ subtotal }}) * (1 - CAST(({{ discount_pct }}) AS DECIMAL(38, 10)) / 100), 2))) * CASE WHEN UPPER(({{ state }})) = 'CA' THEN 0.0725 WHEN UPPER(({{ state }})) = 'TX' THEN 0.0625 WHEN UPPER(({{ state }})) = 'NY' THEN 0.04 WHEN LOWER(UPPER(({{ state }}))) IN (LOWER('OR'), LOWER('MT'), LOWER('NH'), LOWER('DE')) THEN 0 ELSE 0.05 END, 2)) + {{ shipping }}, 2)
RedshiftROUND((ROUND(({{ subtotal }}) * (1 - CAST(({{ discount_pct }}) AS DECIMAL(38, 10)) / 100), 2)) + (ROUND(((ROUND(({{ subtotal }}) * (1 - CAST(({{ discount_pct }}) AS DECIMAL(38, 10)) / 100), 2))) * CASE WHEN UPPER(({{ state }})) = 'CA' THEN 0.0725 WHEN UPPER(({{ state }})) = 'TX' THEN 0.0625 WHEN UPPER(({{ state }})) = 'NY' THEN 0.04 WHEN LOWER(UPPER(({{ state }}))) IN (LOWER('OR'), LOWER('MT'), LOWER('NH'), LOWER('DE')) THEN 0 ELSE 0.05 END, 2)) + {{ shipping }}, 2)
PostgresROUND(CAST((ROUND(CAST(({{ subtotal }}) * (1 - CAST(({{ discount_pct }}) AS NUMERIC) / 100) AS NUMERIC), 2)) + (ROUND(CAST(((ROUND(CAST(({{ subtotal }}) * (1 - CAST(({{ discount_pct }}) AS NUMERIC) / 100) AS NUMERIC), 2))) * CASE WHEN UPPER(({{ state }})) = 'CA' THEN 0.0725 WHEN UPPER(({{ state }})) = 'TX' THEN 0.0625 WHEN UPPER(({{ state }})) = 'NY' THEN 0.04 WHEN LOWER(UPPER(({{ state }}))) IN (LOWER('OR'), LOWER('MT'), LOWER('NH'), LOWER('DE')) THEN 0 ELSE 0.05 END AS NUMERIC), 2)) + {{ shipping }} AS NUMERIC), 2)
SQL Server, Azure SQL, Synapse, FabricROUND((ROUND(({{ subtotal }}) * (1 - CAST(({{ discount_pct }}) AS DECIMAL(38, 10)) / 100), 2)) + (ROUND(((ROUND(({{ subtotal }}) * (1 - CAST(({{ discount_pct }}) AS DECIMAL(38, 10)) / 100), 2))) * CASE WHEN UPPER(({{ state }})) = 'CA' THEN 0.0725 WHEN UPPER(({{ state }})) = 'TX' THEN 0.0625 WHEN UPPER(({{ state }})) = 'NY' THEN 0.04 WHEN LOWER(UPPER(({{ state }}))) IN (LOWER('OR'), LOWER('MT'), LOWER('NH'), LOWER('DE')) THEN 0 ELSE 0.05 END, 2)) + {{ shipping }}, 2)
OracleROUND((ROUND(({{ subtotal }}) * (1 - ({{ discount_pct }}) / 100), 2)) + (ROUND(((ROUND(({{ subtotal }}) * (1 - ({{ discount_pct }}) / 100), 2))) * CASE WHEN UPPER(({{ state }})) = 'CA' THEN 0.0725 WHEN UPPER(({{ state }})) = 'TX' THEN 0.0625 WHEN UPPER(({{ state }})) = 'NY' THEN 0.04 WHEN LOWER(UPPER(({{ state }}))) IN (LOWER('OR'), LOWER('MT'), LOWER('NH'), LOWER('DE')) THEN 0 ELSE 0.05 END, 2)) + {{ shipping }}, 2)
MySQLROUND((ROUND(({{ subtotal }}) * (1 - ({{ discount_pct }}) / 100), 2)) + (ROUND(((ROUND(({{ subtotal }}) * (1 - ({{ discount_pct }}) / 100), 2))) * CASE WHEN UPPER(({{ state }})) = 'CA' THEN 0.0725 WHEN UPPER(({{ state }})) = 'TX' THEN 0.0625 WHEN UPPER(({{ state }})) = 'NY' THEN 0.04 WHEN LOWER(UPPER(({{ state }}))) IN (LOWER('OR'), LOWER('MT'), LOWER('NH'), LOWER('DE')) THEN 0 ELSE 0.05 END, 2)) + {{ shipping }}, 2)
A remainder SQL Server and Fabric write MOD as %, which binds tighter than + and -: MOD(month - 1, 3) is ((month - 1) % (3)) there, never month - 1 % 3.

Formula QuarterStart: =DATEADD(MonthStart(day), 0 - MOD(MONTH(day) - 1, 3), "month")

SnowflakeDATEADD(month, 0 - MOD(EXTRACT(MONTH FROM {{ day }}) - 1, 3), (DATEADD(day, 1 - EXTRACT(DAY FROM ({{ day }})), ({{ day }}))))
BigQueryDATE_ADD((DATE_ADD(({{ day }}), INTERVAL 1 - EXTRACT(DAY FROM ({{ day }})) DAY)), INTERVAL 0 - MOD(EXTRACT(MONTH FROM {{ day }}) - 1, 3) MONTH)
DatabricksDATEADD(month, 0 - MOD(EXTRACT(MONTH FROM {{ day }}) - 1, 3), (DATEADD(day, 1 - EXTRACT(DAY FROM ({{ day }})), ({{ day }}))))
Redshift(((({{ day }}) + (1 - EXTRACT(DAY FROM ({{ day }}))) * INTERVAL '1 day')) + (0 - MOD(EXTRACT(MONTH FROM {{ day }}) - 1, 3)) * INTERVAL '1 month')
Postgres(((({{ day }}) + (1 - EXTRACT(DAY FROM ({{ day }}))) * INTERVAL '1 day')) + (0 - MOD(EXTRACT(MONTH FROM {{ day }}) - 1, 3)) * INTERVAL '1 month')
SQL Server, Azure SQL, Synapse, FabricDATEADD(month, 0 - ((DATEPART(month, {{ day }}) - 1) % (3)), (DATEADD(day, 1 - DATEPART(day, ({{ day }})), ({{ day }}))))
OracleADD_MONTHS(((({{ day }}) + NUMTODSINTERVAL(1 - EXTRACT(DAY FROM ({{ day }})), 'DAY'))), 0 - MOD(EXTRACT(MONTH FROM {{ day }}) - 1, 3))
MySQLDATE_ADD((DATE_ADD(({{ day }}), INTERVAL 1 - EXTRACT(DAY FROM ({{ day }})) DAY)), INTERVAL 0 - MOD(EXTRACT(MONTH FROM {{ day }}) - 1, 3) MONTH)
Raising to a power SQL Server and Fabric answer POWER in its base's type, so POWER(1.045, 5) keeps three places and $10,000 compounded comes out $1.82 short. The engine makes the base an exact decimal there.

Formula CompoundValue: =ROUND(principal * POWER(1 + rate, years), 2)

SnowflakeROUND({{ principal }} * POWER(1 + {{ rate }}, {{ years }}), 2)
BigQueryROUND({{ principal }} * POWER(1 + {{ rate }}, {{ years }}), 2)
DatabricksROUND({{ principal }} * POWER(1 + {{ rate }}, {{ years }}), 2)
RedshiftROUND({{ principal }} * POWER(1 + {{ rate }}, {{ years }}), 2)
PostgresROUND(CAST({{ principal }} * POWER(1 + {{ rate }}, {{ years }}) AS NUMERIC), 2)
SQL Server, Azure SQL, Synapse, FabricROUND({{ principal }} * POWER(CAST(1 + {{ rate }} AS DECIMAL(38, 10)), {{ years }}), 2)
OracleROUND({{ principal }} * POWER(1 + {{ rate }}, {{ years }}), 2)
MySQLROUND({{ principal }} * POWER(1 + {{ rate }}, {{ years }}), 2)
Long IF chains IF inside IF is written as one CASE - WHEN a THEN x WHEN b THEN y ELSE z - not a CASE in a CASE: SQL Server and Fabric nest CASE only ten deep, and one CASE is easier to read everywhere.

Formula InvoiceNextStep: =IF(PaymentStatus(amount_due, amount_paid, due_day, as_of) = "Paid", "Close", IF(DunningStage(due_day, as_of, amount_due, amount_paid) = "Collections", "Send to collections", IF(DunningStage(due_day, as_of, amount_due, amount_paid) = "None", "Wait", "Send " & LOWER(DunningStage(due_day, as_of, amount_due, amount_paid)))))

SnowflakeCASE WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'Paid' WHEN ({{ amount_paid }}) > 0 THEN CASE WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Partial, overdue' ELSE 'Partial' END WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Overdue' ELSE 'Open' END) = 'Paid' THEN 'Close' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'Collections' THEN 'Send to collections' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'None' THEN 'Wait' ELSE CONCAT('Send ', COALESCE(CAST(LOWER((CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END)) AS VARCHAR), '')) END
BigQueryCASE WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'Paid' WHEN ({{ amount_paid }}) > 0 THEN CASE WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Partial, overdue' ELSE 'Partial' END WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Overdue' ELSE 'Open' END) = 'Paid' THEN 'Close' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'Collections' THEN 'Send to collections' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'None' THEN 'Wait' ELSE CONCAT('Send ', COALESCE(CAST(LOWER((CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END)) AS STRING), '')) END
DatabricksCASE WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'Paid' WHEN ({{ amount_paid }}) > 0 THEN CASE WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Partial, overdue' ELSE 'Partial' END WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Overdue' ELSE 'Open' END) = 'Paid' THEN 'Close' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'Collections' THEN 'Send to collections' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'None' THEN 'Wait' ELSE CONCAT('Send ', COALESCE(CAST(LOWER((CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END)) AS STRING), '')) END
RedshiftCASE WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'Paid' WHEN ({{ amount_paid }}) > 0 THEN CASE WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Partial, overdue' ELSE 'Partial' END WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Overdue' ELSE 'Open' END) = 'Paid' THEN 'Close' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'Collections' THEN 'Send to collections' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'None' THEN 'Wait' ELSE ('Send ' || COALESCE(CAST(LOWER((CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END)) AS VARCHAR), '')) END
PostgresCASE WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'Paid' WHEN ({{ amount_paid }}) > 0 THEN CASE WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Partial, overdue' ELSE 'Partial' END WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Overdue' ELSE 'Open' END) = 'Paid' THEN 'Close' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'Collections' THEN 'Send to collections' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'None' THEN 'Wait' ELSE CONCAT('Send ', LOWER((CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + (30) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + (60) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + (90) * INTERVAL '1 day') >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END))) END
SQL Server, Azure SQL, Synapse, FabricCASE WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'Paid' WHEN ({{ amount_paid }}) > 0 THEN CASE WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Partial, overdue' ELSE 'Partial' END WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Overdue' ELSE 'Open' END) = 'Paid' THEN 'Close' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'Collections' THEN 'Send to collections' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'None' THEN 'Wait' ELSE CONCAT('Send ', LOWER((CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATEADD(day, 30, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATEADD(day, 60, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATEADD(day, 90, CAST((({{ due_day }})) AS DATE)) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END))) END
OracleCASE WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'Paid' WHEN ({{ amount_paid }}) > 0 THEN CASE WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Partial, overdue' ELSE 'Partial' END WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Overdue' ELSE 'Open' END) = 'Paid' THEN 'Close' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'Collections' THEN 'Send to collections' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'None' THEN 'Wait' ELSE ('Send ' || LOWER((CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(30, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(60, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN (CAST((({{ due_day }})) AS DATE) + NUMTODSINTERVAL(90, 'DAY')) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END))) END
MySQLCASE WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'Paid' WHEN ({{ amount_paid }}) > 0 THEN CASE WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Partial, overdue' ELSE 'Partial' END WHEN CAST(({{ due_day }}) AS DATE) < CAST(({{ as_of }}) AS DATE) THEN 'Overdue' ELSE 'Open' END) = 'Paid' THEN 'Close' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'Collections' THEN 'Send to collections' WHEN (CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END) = 'None' THEN 'Wait' ELSE CONCAT('Send ', COALESCE(CAST(LOWER((CASE WHEN ({{ amount_paid }}) >= ({{ amount_due }}) THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = 'Current' THEN 'None' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '1-30' THEN 'Reminder' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '31-60' THEN 'Second notice' WHEN (CASE WHEN CAST((({{ due_day }})) AS DATE) >= CAST((({{ as_of }})) AS DATE) THEN 'Current' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 30 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '1-30' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 60 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '31-60' WHEN DATE_ADD(CAST((({{ due_day }})) AS DATE), INTERVAL 90 DAY) >= CAST((({{ as_of }})) AS DATE) THEN '61-90' ELSE '90+' END) = '61-90' THEN 'Final notice' ELSE 'Collections' END)) AS CHAR), '')) END
Empty text on Oracle Oracle stores empty text as NULL, so TRIM(text) = '' is never true there. The engine writes a comparison with empty text as IS NULL (or IS NOT NULL) on Oracle.

Formula TextOrUnknown: =IF(OR(ISBLANK(text), TRIM(text) = ""), "Unknown", TRIM(text))

SnowflakeCASE WHEN (({{ text }} IS NULL) OR TRIM({{ text }}) = '') THEN 'Unknown' ELSE TRIM({{ text }}) END
BigQueryCASE WHEN (({{ text }} IS NULL) OR TRIM({{ text }}) = '') THEN 'Unknown' ELSE TRIM({{ text }}) END
DatabricksCASE WHEN (({{ text }} IS NULL) OR TRIM({{ text }}) = '') THEN 'Unknown' ELSE TRIM({{ text }}) END
RedshiftCASE WHEN (({{ text }} IS NULL) OR TRIM({{ text }}) = '') THEN 'Unknown' ELSE TRIM({{ text }}) END
PostgresCASE WHEN (({{ text }} IS NULL) OR TRIM({{ text }}) = '') THEN 'Unknown' ELSE TRIM({{ text }}) END
SQL Server, Azure SQL, Synapse, FabricCASE WHEN (({{ text }} IS NULL) OR TRIM({{ text }}) = '') THEN 'Unknown' ELSE TRIM({{ text }}) END
OracleCASE WHEN (({{ text }} IS NULL) OR (TRIM({{ text }}) IS NULL)) THEN 'Unknown' ELSE TRIM({{ text }}) END
MySQLCASE WHEN (({{ text }} IS NULL) OR TRIM({{ text }}) = '') THEN 'Unknown' ELSE TRIM({{ text }}) END
Rounding a computed value Postgres rounds to places only a NUMERIC, and SQRT and POWER answer double precision - so the engine casts before ROUND there.

Formula Distance2d: =ROUND(SQRT(POWER(x2 - x1, 2) + POWER(y2 - y1, 2)), 2)

SnowflakeROUND(SQRT(POWER({{ x2 }} - {{ x1 }}, 2) + POWER({{ y2 }} - {{ y1 }}, 2)), 2)
BigQueryROUND(SQRT(POWER({{ x2 }} - {{ x1 }}, 2) + POWER({{ y2 }} - {{ y1 }}, 2)), 2)
DatabricksROUND(SQRT(POWER({{ x2 }} - {{ x1 }}, 2) + POWER({{ y2 }} - {{ y1 }}, 2)), 2)
RedshiftROUND(SQRT(POWER({{ x2 }} - {{ x1 }}, 2) + POWER({{ y2 }} - {{ y1 }}, 2)), 2)
PostgresROUND(CAST(SQRT(POWER({{ x2 }} - {{ x1 }}, 2) + POWER({{ y2 }} - {{ y1 }}, 2)) AS NUMERIC), 2)
SQL Server, Azure SQL, Synapse, FabricROUND(SQRT(POWER(CAST({{ x2 }} - {{ x1 }} AS DECIMAL(38, 10)), 2) + POWER(CAST({{ y2 }} - {{ y1 }} AS DECIMAL(38, 10)), 2)), 2)
OracleROUND(SQRT(POWER({{ x2 }} - {{ x1 }}, 2) + POWER({{ y2 }} - {{ y1 }}, 2)), 2)
MySQLROUND(SQRT(POWER({{ x2 }} - {{ x1 }}, 2) + POWER({{ y2 }} - {{ y1 }}, 2)), 2)
Starts with, ends with LIKE with an explicit ESCAPE, so a % or _ inside the data is never read as a wildcard. BigQuery has no ESCAPE clause: a backslash escapes there, and inside its text a quote is \' rather than doubled.

Formula IsClearance: =STARTSWITH(UPPER(TRIM(sku)), "CLR-")

SnowflakeUPPER(TRIM({{ sku }})) LIKE 'CLR-%' ESCAPE '!'
BigQueryUPPER(TRIM({{ sku }})) LIKE 'CLR-%'
DatabricksUPPER(TRIM({{ sku }})) LIKE 'CLR-%' ESCAPE '!'
RedshiftUPPER(TRIM({{ sku }})) LIKE 'CLR-%' ESCAPE '!'
PostgresUPPER(TRIM({{ sku }})) LIKE 'CLR-%' ESCAPE '!'
SQL Server, Azure SQL, Synapse, FabricUPPER(TRIM({{ sku }})) LIKE 'CLR-%' ESCAPE '!'
OracleUPPER(TRIM({{ sku }})) LIKE 'CLR-%' ESCAPE '!'
MySQLUPPER(TRIM({{ sku }})) LIKE 'CLR-%' ESCAPE '!'
Case-insensitive lists Snowflake and Postgres compare text case-sensitively, SQL Server and MySQL usually do not - the engine lowers both sides of in, so the answer is the same everywhere.

Formula IsPaid: =LOWER(TRIM(status)) in ["paid", "settled", "captured"]

SnowflakeLOWER(LOWER(TRIM({{ status }}))) IN (LOWER('paid'), LOWER('settled'), LOWER('captured'))
BigQueryLOWER(LOWER(TRIM({{ status }}))) IN (LOWER('paid'), LOWER('settled'), LOWER('captured'))
DatabricksLOWER(LOWER(TRIM({{ status }}))) IN (LOWER('paid'), LOWER('settled'), LOWER('captured'))
RedshiftLOWER(LOWER(TRIM({{ status }}))) IN (LOWER('paid'), LOWER('settled'), LOWER('captured'))
PostgresLOWER(LOWER(TRIM({{ status }}))) IN (LOWER('paid'), LOWER('settled'), LOWER('captured'))
SQL Server, Azure SQL, Synapse, FabricLOWER(LOWER(TRIM({{ status }}))) IN (LOWER('paid'), LOWER('settled'), LOWER('captured'))
OracleLOWER(LOWER(TRIM({{ status }}))) IN (LOWER('paid'), LOWER('settled'), LOWER('captured'))
MySQLLOWER(LOWER(TRIM({{ status }}))) IN (LOWER('paid'), LOWER('settled'), LOWER('captured'))

What the engine leaves to you

  • True/false as a column SQL Server, and Oracle before 23ai, have no true/false column type: use a check like IsPaid in WHERE or inside IF, not as a selected column. A bit column is passed as 'flag = 1'.

What stays a dbt macro

Formulas are rules about one row. A dbt project has other macros too, and they stay dbt’s:

  • Where models land generate_schema_name, generate_alias_name and database routing per environment.
  • Grants and hooks on-run-start, post-hook, grants - statements about objects, not values in a row.
  • Incremental logic is_incremental(), merge strategies, and the lookback a model uses.
  • Reading the warehouse run_query, adapter.get_columns_in_relation and star - macros that ask the database first.
  • Set-level helpers date spines, pivot and unpivot, union_relations, deduplication across rows.
  • Rows over rows Window functions and aggregates - running totals, LAG, rank. A formula works on one row.
  • Hashed keys generate_surrogate_key and friends: MD5 and SHA are not formula functions.
  • Materializations Custom materializations and adapter.dispatch for DDL.