Поворот столбца с апострофом в DBT

Я пытаюсь повернуть столбец с помощью апострофа, но в DBT это очень сложно. Есть идеи? Я пробовал использовать двойные кавычки, но dbt не улавливает это, и я не могу использовать оператор Like в сводной таблице.

 {% set pvt_details=[
      ('General liability cover_rated_premium' , 'gl_premium')
    , ('Contractors' errors and omissions cover_rated_premium','eo_premium') ] %}
 WITH filtered AS (
     SELECT
     quote_id
    , target
    , premium_after_amount
 from {{ source('acdc', 'chopin_quote_rating_steps') }} cqrs
 WHERE target IN ({% for column in pvt_details %} '{{column[0]}}' {%- if not loop.last -%} 
, {%- endif %}
  {% endfor %})
    AND action = 'initial_premium'
  )
  select *
  from filtered
  pivot(sum(premium_after_amount)
   for target in ({% for column in pvt_details %} '{{column[0]}}' {%- if not loop.last -%} , 
{%- endif %}
{% endfor %}))
  as p (quote_id,
        {% for column in pvt_details %} {{column[1]}} {%- if not loop.last -%} , {%- endif 
%}
        {% endfor %})

3 ответа

Попробуйте эту ссылку в макросах DBT. Есть макрос только для разворотов.

https://github.com/fishtown-analytics/dbt-utils/blob/master/macros/sql/pivot.sql

{# Сводные значения из строк в столбцы.

Пример:

Input: `public.test`

| size | color |
|------+-------|
| S    | red   |
| S    | blue  |
| S    | red   |
| M    | red   |

select
  size,
  {{ dbt_utils.pivot('color', dbt_utils.get_column_values('public.test',
                                                          'color')) }}
from public.test
group by size

Output:

| size | red | blue |
|------+-----+------|
| S    | 2   | 1    |
| M    | 1   | 0    |

Аргументы: столбец: имя столбца, обязательные значения: список значений строк для преобразования в столбцы, требуемый псевдоним: создавать ли псевдонимы столбцов, по умолчанию - True agg: функция агрегации SQL, по умолчанию - сумма cmp: сравнение значений SQL, по умолчанию - = префикс: Префикс псевдонима столбца, по умолчанию - пустой суффикс: Постфикс псевдонима столбца, по умолчанию - пустой then_value: Значение, используемое в случае успешного сравнения, по умолчанию - 1 else_value: Значение, которое следует использовать, если сравнение не удается, по умолчанию - 0 quote_identifiers: Следует ли окружать псевдонимы столбцов двойным кавычки, по умолчанию true #}

{% macro pivot (column, values, alias =True,agg='sum',cmp='=',prefix='',suffix='',then_value=1,else_value=0,quote_identifiers=True)%} { % для v в значениях%} {{ agg }}(если {{ column }} {{ cmp }} '{{ v }}', затем {{ then_value }} else {{ else_value }} end) {% if alias %} {% if quote_identifiers %} как {{адаптер.quote(префикс ~ v ~ суффикс) }} {% else %} как {{префикс ~ v ~ суффикс}} {% endif%} {% endif%} {% если не loop.last %},{% endif %} {% endfor %} {% endmacro %}

{% set pvt_details=[ ('Покрытие_премиум_представления_ общей ответственности', 'gl_premium'),("Ошибки и упущения подрядчика покрывают_ра_согласно_премиуму", 'eo_premium') ] %} выберите

concat_ws(' :: ',
    {% for column in pvt_details %} 
        '{{ column[0] }}'
    {%- if not loop.last -%},  {%- endif %}
    {% endfor %}
) as column_selection

от {{ ref('reference_model') }} ограничение 1 Свернуть

От Кристины из DBT. У Jinja2, похоже, есть проблема с цитированием, как это делают многие другие языки =/.

Если они хотят придерживаться своего собственного запроса, я подозреваю, что они заменят

"Ошибки и упущения подрядчиков" cover_rated_premium "

с "ошибками и упущениями подрядчиков cover_rated_premium", где вы используете "

вместо "может исправить?" но не уверен на 100%, что здесь что-то еще вызывает проблемы. Я считаю, что макрос утилиты pivot должен отлично работать! Просто не уверен, что он справится с этим (я думаю, что должен). Они также не смогут переименовать столбец на том же этапе, что и поворот (как я думаю, здесь происходит), но они могут легко использовать функцию поворота, а затем переименовать столбцы в следующем CTE

От Эндрю из DBT

Другие вопросы по тегам