MySQL 合并非空值与其他 case when 和 coalesce 语句冲突 - 不确定如何修复

标签 mysql null coalesce isnull

我无法将我编写的最初忽略空值的代码转换为接受空值并将其转换为 0 的代码。

where 子句删除 ladder_advocacy = null 的任何值。我们还在案例陈述中利用了这一点。

但是,我实际上很关心 ladder_advocacy (Etc) 何时为空。当一个人第一次加入组织时,他们的默认阶梯值是空的。在我的分析中,我想知道有多少人从 A→B、B→E 等以及 null -> B、null -> e 移动。现在,该查询严重低估了任何变化,因为我们知道有一定比例的人实际上并没有首先以阶梯级别(比如 C1)加入组织,而是首先以 null 身份加入。

我不确定如何解决这个问题。

这是原始代码:

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;

我尝试在第一个之前在临时表中执行一个 coalese 函数来转换 null –> 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 子句,但这也没有解决问题,因为它搞砸了。

想法?谢谢!

最佳答案

将 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),

完美运行。

关于MySQL 合并非空值与其他 case when 和 coalesce 语句冲突 - 不确定如何修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54409373/

相关文章:

java - 检查可选对象是否不为空且为空

java - 如何解决 findbug 问题 : Null passed for nonnull parameter

mysql - 加入合并(公式1、公式2、公式3)

r - 如何用 R 中另一个 tibble 的估算列替换 tibble 中的 NA 列

mysql - 将另一个表添加到 mySQL 查询

mysql - 添加两个独立表的SUM

php - MySQL : "How to store row from one table(link) to multiple(cateogry) tables."

PHP:将两个单独的 mysql 查询加入同一个 json 数据对象

android - android pie 上的 Retrofit2 响应为空

php - MySql COALESCE 不工作