Преобразование строк в столбцы с использованием кросс-таблицы в PostgreSQL не работает (отношение «таблица» не существует) - PullRequest
0 голосов
/ 03 мая 2020

Мне нужно использовать скомпилированные данные с использованием CTE, а затем преобразовать столбцы в строки с помощью кросс-таблицы (открытой для других идей) в следующем операторе select. Ниже приведен запрос.

    with checked_adgroup AS (
         SELECT 
            ua.new_adgroup,
            ua.account,
            ua.campaign,
            ua.ad_group,
            ua."position",
            cp.category,
            pt.full_value,

   FROM unnest_adgroup ua
     LEFT JOIN taxonomy_category cp ON ua."position" = cp."position"
     LEFT JOIN taxonomy pt ON ua.short_val = pt.short_value AND cp.category = pt.category AND (pt.lob IS NULL OR pt.lob = ua.lob)
         )

        SELECT * 
        from crosstab(
        'select
        cad.account,
        cad.campaign,
        cad.ad_group,
        cad.category,
        cad.full_value
        FROM checked_adgroup cad 
        WHERE  cad.all_correct AND cad.category IS NOT NULL
        ORDER BY 1,2,3')
        AS final_result( 
         account text, campaign text, ad_group text,
         division text, lob text, match_type text  );

Сообщение об ошибке: ОШИБКА: отношение "selected_adgroup" не существует LINE 7: FROM checked_adgroup cad

Вывод команды selected_adgroup cte выглядит следующим образом: ниже:

введите описание изображения здесь

Желаемый результат окончательного утверждения:

введите описание изображения здесь

1 Ответ

0 голосов
/ 04 мая 2020

Добро пожаловать в сообщество. Прежде всего, пожалуйста, не размещайте изображения, с ними бесполезно работать, а в некоторых случаях они запрещены и не могут быть просмотрены. Вместо этого используйте форматированный текст. Я не очень много использовал функциональность кросс-таблицы, но она предлагает вторую версию, которая содержит 2 запроса, второй - первый. Однако в опубликованном запросе есть пара ошибок, которые необходимо исправить в любом случае. Так что сначала. Ищите - << тег. </p>

   with checked_adgroup AS (
         SELECT 
            ua.new_adgroup,
            ua.account,
            ua.campaign,
            ua.ad_group,
            ua."position",
            cp.category,
            pt.full_value,
            --<< missing column or ending , above should not be there, assumption missing column see below. 
   FROM unnest_adgroup ua
     LEFT JOIN taxonomy_category cp ON ua."position" = cp."position"
     LEFT JOIN taxonomy pt ON ua.short_val = pt.short_value AND cp.category = pt.category AND (pt.lob IS NULL OR pt.lob = ua.lob)
         )

    SELECT * 
    from crosstab(
    'select
    cad.account,
    cad.campaign,
    cad.ad_group,
    cad.category,
    cad.full_value
    FROM checked_adgroup cad 
    WHERE  cad.all_correct AND cad.category IS NOT NULL
    --<< above line has 2 errors:
    --<< Incorrectly formatted needs to cad.all_correct is not null AND cad.category IS NOT NULL
    --<< column cad.all_correct does not exist (see missing column above  
    ORDER BY 1,2,3')
    AS final_result( 
     account text, campaign text, ad_group text,
     division text, lob text, match_type text);  

Теперь нам нужно преобразовать CTE во второй запрос, который кросс-таблица могла бы использовать. Я идентифицировал каждого с Postgres $ Quoting $, не столько по необходимости, сколько стандартной строковой кавычки (') было бы достаточно, но больше по видимости.

select * 
   from crosstab(
    $ct1$select
               account,
               campaign,
               ad_group,
               category,
               full_value
         --<< from checked_adgroup cad 
         --<< where cad.all_correct and cad.category is not null
         --<< moved above lines to second query to avoid reference and removed qualification  
         order by 1,2,3
     $ct1$ 
   , $ct2$select * 
            from (
                  select 
                        ua.new_adgroup,
                        ua.account,
                        ua.campaign,
                        ua.ad_group,
                        ua."position",
                        cp.category,
                        pt.full_value,
                        'mssing from orig posted query'  all_correct
                   from unnest_adgroup ua
                   left join taxonomy_category cp on ua."position" = cp."position"
                   left join taxonomy pt on ua.short_val = pt.short_value 
                                        and cp.category = pt.category 
                                        and (pt.lob is null or pt.lob = ua.lob)
                 ) s                    
           where all_correct is not null and cad.category is not null
           --<< move from query1 
       $ct2$ )
  as final_result( 
     account text, campaign text, ad_group text,
     division text, lob text, match_type text  );

Но на этом этапе я получаю сообщение об ошибке unnest_adgroup не существует. Что верно, поскольку вы не опубликовали определение, а не другие ссылочные таблицы. Но это означает, что синтаксис правильный. По общему признанию, это может быть далеко от базы, если это так, так и быть, я всегда могу удалить позже. Но я застрял дома без других проектов в данный момент, и это кажется интересным вопросом. Ждем результатов. Удачи.

...