forked from dbt-labs/dbt-utils
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathunpivot.sql
52 lines (37 loc) · 1.72 KB
/
unpivot.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
{#
Pivot values from columns to rows. Similar to pandas DataFrame melt() function.
Example Usage: {{ unpivot(table=ref('users'), cast_to='integer', exclude=['id','created_at']) }}
Arguments:
table: Relation object, required.
cast_to: The datatype to cast all unpivoted columns to. Default is varchar.
exclude: A list of columns to keep but exclude from the unpivot operation. Default is none.
remove: A list of columns to remove from the resulting table. Default is none.
field_name: Destination table column name for the source table column names.
value_name: Destination table column name for the pivoted values
#}
{% macro unpivot(table, cast_to='varchar', exclude=none, remove=none, field_name='field_name', value_name='value') -%}
{%- set exclude = exclude if exclude is not none else [] %}
{%- set remove = remove if remove is not none else [] %}
{%- set include_cols = [] %}
{%- set table_columns = {} %}
{%- set _ = table_columns.update({table: []}) %}
{%- do dbt_utils_sqlserver._is_relation(table, 'unpivot') -%}
{%- set cols = adapter.get_columns_in_relation(table) %}
{%- for col in cols -%}
{%- if col.column.lower() not in remove|map('lower') and col.column.lower() not in exclude|map('lower') -%}
{% set _ = include_cols.append(col) %}
{%- endif %}
{%- endfor %}
{%- for col in include_cols -%}
select
{%- for exclude_col in exclude %}
{{ exclude_col }},
{%- endfor %}
cast('{{ col.column }}' as {{ dbt_utils_sqlserver.type_string() }}) as {{ field_name }},
cast({{ col.column }} as {{ cast_to }}) as {{ value_name }}
from {{ table }}
{% if not loop.last -%}
union all
{% endif -%}
{%- endfor -%}
{%- endmacro %}