MySQL объединяет ненулевые значения, конфликтующие с дополнительным случаем и операторы объединения - не знаю, как это исправить - PullRequest
0 голосов
/ 28 января 2019

У меня проблемы с преобразованием кода, который я написал, чтобы изначально игнорировать нулевые значения, в тот, который принимает и преобразует нулевые значения в 0.

Предложение where удаляет все значения, где ladder_advocacy = null.Мы также используем это в выражении case.

Тем не менее, меня действительно волнует, когда ladder_advocacy (Etc) равны нулю.Когда человек впервые присоединяется к организации, его значения в лестнице по умолчанию равны нулюВ своем анализе я хочу узнать, сколько людей перешло из A B, B E и т. Д., А также из NULL -> B, NULL -> E.Прямо сейчас в запросе серьезно недооцениваются любые изменения, потому что мы знаем, что некоторый процент людей на самом деле сначала не присоединяются к организации на лестничном уровне (скажем, как С1), а сначала присоединяются как нулевые.

Я не уверен, как обойти это, чтобы исправить это.

Это оригинальный код:

CREATE TEMPORARY TABLE cte_leenk_ladder_history_order
     SELECT
        lh.member_id
        ,sc.salesforce_id
        ,sc.lastname
        ,trigger_record_id
        ,ladder_change
        ,date_trigger_event
        ,@ladder_value
        ,lh.ladder_config_id AS ladder_config_id
        ,trigger_name
        ,lc.active as config_active
        ,lc.`trigger` as trigger_active
        ,COALESCE(lh.ladder_advocacy,lh.ladder_elected,lh.ladder_policy,lh.ladder_organizing,lh.ladder_organizing,lh.ladder_engagement) AS ladder_value
        ,CASE WHEN lh.ladder_advocacy IS NOT NULL THEN 'ladder_advocacy'
               WHEN lh.ladder_elected IS NOT NULL THEN 'ladder_elected'
               WHEN lh.ladder_policy IS NOT NULL THEN 'ladder_policy'
               WHEN lh.ladder_organizing IS NOT NULL THEN 'ladder_organizing'
               WHEN lh.ladder_collective IS NOT NULL THEN 'ladder_collective'
               WHEN lh.ladder_engagement IS NOT NULL THEN 'ladder_engagement'
            END
            AS ladder_name
        FROM leeds_new.leenk_ladder_history AS lh
            INNER JOIN leeds_new.leenk_ladder_config AS lc ON lh.ladder_config_id = lc.ladder_config_id
            INNER JOIN leeds_new.salesforce_contacts AS sc ON lh.member_id = sc.salesforce_id
WHERE lh.ladder_advocacy IS NOT NULL
ORDER BY date_trigger_event  DESC;

Я попытался сделать грубую функцию для преобразования нуля -> 0 ввременная таблица перед этой первой и затем присоединяющаяся к ней:

CREATE TEMPORARY TABLE cte_ladder_levels_to_non_null
                SELECT
                 member_id,
                COALESCE(ladder_advocacy, 0) AS ladder_advocacy,
                COALESCE(ladder_elected, 0) AS ladder_elected,
                COALESCE(ladder_policy, 0) AS ladder_policy,
                COALESCE(ladder_organizing, 0) AS ladder_organizing,
                COALESCE(ladder_engagement, 0) AS ladder_engagement,
                COALESCE(ladder_collective, 0) AS ladder_collective
    FROM
         leeds_new.leenk_ladder_history;

CREATE TEMPORARY TABLE cte_leenk_ladder_history_order
     SELECT
        lh.member_id
        ,sc.salesforce_id
        ,sc.lastname
        ,trigger_record_id
        ,ladder_change
        ,date_trigger_event
        ,@ladder_value
        ,lh.ladder_config_id AS ladder_config_id
        ,trigger_name
        ,lc.active as config_active
        ,lc.`trigger` as trigger_active
        ,COALESCE(
                cte_ladder_levels_to_non_null.ladder_advocacy,
                cte_ladder_levels_to_non_null.ladder_elected,
                cte_ladder_levels_to_non_null.ladder_policy,
                cte_ladder_levels_to_non_null.ladder_organizing,
                cte_ladder_levels_to_non_null.ladder_organizing,
                cte_ladder_levels_to_non_null.ladder_engagement) AS ladder_value
        ,CASE WHEN lh.ladder_advocacy IS NOT NULL THEN 'ladder_advocacy'
               WHEN lh.ladder_elected IS NOT NULL THEN 'ladder_elected'
               WHEN lh.ladder_policy IS NOT NULL THEN 'ladder_policy'
              WHEN lh.ladder_organizing IS NOT NULL THEN 'ladder_organizing'
               WHEN lh.ladder_collective IS NOT NULL THEN 'ladder_collective'
               WHEN lh.ladder_engagement IS NOT NULL THEN 'ladder_engagement'
            END
            AS ladder_name
        FROM leeds_new.leenk_ladder_history AS lh
inner join cte_ladder_levels_to_non_null as llnn on lh.member_id = llnn.member_id
            INNER JOIN leeds_new.leenk_ladder_config AS lc ON lh.ladder_config_id = lc.ladder_config_id
            INNER JOIN leeds_new.salesforce_contacts AS sc ON lh.member_id = sc.salesforce_id
WHERE lh.ladder_advocacy IS NOT NULL
ORDER BY date_trigger_event  DESC;

Но я получаю сообщение об ошибке «недопустимое имя поля» с этой строкой: cte_ladder_levels_to_non_null.ladder_advocacy (и уровни лестниц, которые следуют за ней).

Я также пытался удалить предложение where, но это тоже не решает проблему, потому что оно портит регистр.

Мысли?Спасибо!

1 Ответ

0 голосов
/ 29 января 2019

Переместил ifnull в последнюю часть запроса (последнюю постоянную таблицу):

ifnull(member_id_lh2,0), 
            ifnull(trigger_name_lh2,0),
            ifnull(trigger_record_id_lh2,0), 
            date_trigger_event_lh2,
            ifnull(ladder_name_lh2,0),
            ifnull(ladder_value_lh2,0),
            ifnull(ladder_change_lh2,0),
            ifnull(config_active_lh2,0),
            ifnull(trigger_active_lh2,0),

Отлично работает.

...