检查 col1 如果重复然后检查 col2 如果不同

Check col1 if duplicate then check col2 if distinct

大家好,我一直在努力在 SnowFlake 中完成一个简单的查询。 下面解释了一个数据示例,

Number ID
2559 23
2559 33
2559 55
2550 89
2499 14
2499 14

基于上面的 table 我想创建一个列来检查 (column Number) 是否有重复值,如果是的话;然后检查(列 ID)与该数字关联的值是否重复或不同。如果值重复则 return 0 如果值不同则 return 1.

想要的结果如下,

Number ID Check
2559 23 1
2559 33 1
2559 55 1
2550 89 0
2499 14 0
2499 14 0

并且最后一个结果应该在数字列级别(分组依据)并且类似于以下 table、

Number Check
2559 1
2550 0
2499 0

如有任何建议,我们将不胜感激。


已编辑 tables

场景已根据新要求更改

原始 table 有两个 ID(ID1 和 ID2),这些 ID 必须链接到两个不同的 table T-ID1 和 T-ID2。

Number ID1 ID2
2559 23 null
2559 33 null
2559 55 null
2550 89 null
2499 14 null
2499 14 null
2498 null 14
2498 null 50
2498 null null

所以想法是,如果 Number 有重复的 ID(在 ID1 或 ID2 中),则 return 1,如果 Number 具有唯一 ID(在 ID1 或 ID2 中),则 return ID1 或 ID2。如果 Number 的 ID1 和 ID2 为空值,则忽略整行。

这是我正在使用的查询 - 一切都基于下面提供的解决方案,但我得到了空值和 ID 值。

ID1 链接到 Supplier_ID_Ekuep,ID2 链接到 Supplier_ID_Qava。

select wbd.WAYBILL_ID, sup.WAYBILL_NO,
       sup.Supplier_ID_Qava, supq.Supplier_Qava, supq.Supllier_City_Qava, supq.Supplier_Qava_Add,
       sup.Supplier_ID_Ekuep, supc.Supplier_Ekuep, supc.Supllier_City_Ekuep, supc.Supplier_Ekuep_Add
from WAYBILL_PRODUCTS wbd
left join (select wb.WAYBILL_ID, ow.WAYBILL_NO,
       case when mult.multi_supp_qava = 1 then '1'
            when mult.multi_supp_qava = 0 then op.ID_Supplier_Qava
            else null end as Supplier_ID_Qava,
       case when mult.multi_supp_ekuep = 1 then '1'
            when mult.multi_supp_ekuep = 0 then op.ID_Supplier_Ekuep
            else null end as Supplier_ID_Ekuep
from WAYBILL_PRODUCTS wb
left join (select ID, ORDER_ID, WAYBILL_NO from ORDER_WAYBILLS) ow on wb.WAYBILL_ID = ow.id
left join (select opr.ID_ORDER, opr.ID_PRODUCT, ss.ID_Supplier_Ekuep, ss.ID_Supplier_Qava
          from ORDER_PRODUCTS opr
left join (select s.id, supc.*, supq.*
          from SUPPLIERS s
left join (select ID_SUPPLIER as ID_Supplier_Ekuep
from EKUEP_KSA_EKUEP_STAGING.PS_SUPPLIER where USED_SUPPLIER_ID is null) supc on supc.ID_Supplier_Ekuep = s.ID_SUPPLIER and s.STORE_ID = 1
left join (select ID_SUPPLIER as ID_Supplier_Qava
from QAVASHOP_KSA_QAVAISH_MAINSHOP.PS_SUPPLIER where USED_SUPPLIER_ID is null) supq on supq.ID_Supplier_Qava = s.ID_SUPPLIER and s.STORE_ID = 2) ss on opr.SUPPLIER_ID = ss.ID
group by opr.ID_ORDER, opr.ID_PRODUCT, ss.ID_Supplier_Ekuep, ss.ID_Supplier_Qava) op on op.ID_PRODUCT = wb.PRODUCT_ID and op.ID_ORDER = ow.ORDER_ID
------------------------------------------------------------------------------------------------------------------------
left join (select wb.WAYBILL_ID, ow.WAYBILL_NO,
       (count(distinct op.ID_Supplier_Qava) > 1)::int as multi_supp_qava,
       (count(distinct op.ID_Supplier_Ekuep) > 1)::int as multi_supp_ekuep
from WAYBILL_PRODUCTS wb
left join (select ID, ORDER_ID, WAYBILL_NO from ORDER_WAYBILLS) ow on wb.WAYBILL_ID = ow.id
left join (select opr.ID_ORDER, opr.ID_PRODUCT, ss.ID_Supplier_Ekuep, ss.ID_Supplier_Qava
          from ORDER_PRODUCTS opr
left join (select s.id, supc.ID_Supplier_Ekuep, supq.ID_Supplier_Qava
          from SUPPLIERS s
left join (select ID_SUPPLIER as ID_Supplier_Ekuep
from EKUEP_KSA_EKUEP_STAGING.PS_SUPPLIER where USED_SUPPLIER_ID is null) supc on supc.ID_Supplier_Ekuep = s.ID_SUPPLIER and s.STORE_ID = 1
left join (select ID_SUPPLIER as ID_Supplier_Qava
from QAVASHOP_KSA_QAVAISH_MAINSHOP.PS_SUPPLIER where USED_SUPPLIER_ID is null) supq on supq.ID_Supplier_Qava = s.ID_SUPPLIER and s.STORE_ID = 2
    ) ss on opr.SUPPLIER_ID = ss.ID
group by opr.ID_ORDER, opr.ID_PRODUCT, ss.ID_Supplier_Ekuep, ss.ID_Supplier_Qava) op on op.ID_PRODUCT = wb.PRODUCT_ID and op.ID_ORDER = ow.ORDER_ID
where _FIVETRAN_DELETED = 0
group by wb.WAYBILL_ID, ow.WAYBILL_NO) mult on mult.WAYBILL_NO = ow.WAYBILL_NO
------------------------------------------------------------------------------------------------------------------------
group by wb.WAYBILL_ID, ow.WAYBILL_NO, mult.multi_supp_qava, mult.multi_supp_ekuep, op.ID_Supplier_Qava, op.ID_Supplier_Ekuep) sup on wbd.WAYBILL_ID = sup.WAYBILL_ID

left join
(select ps.ID_SUPPLIER                  as ID_Supplier_Qava,
        ps.name                         as Supplier_Qava,
        listagg(distinct pa.CITY, ', ') as Supllier_City_Qava,
        ps.DATE_ADD                     as Supplier_Qava_Add
from QAVASHOP_KSA_QAVAISH_MAINSHOP.PS_SUPPLIER ps
left join (select * from QAVASHOP_KSA_QAVAISH_MAINSHOP.PS_ADDRESS) pa on pa.ID_SUPPLIER = ps.ID_SUPPLIER and pa._FIVETRAN_DELETED = 0
where ps.USED_SUPPLIER_ID is null and ps._FIVETRAN_DELETED = 0
group by ID_Supplier_Qava, Supplier_Qava, Supplier_Qava_Add) supq on supq.ID_Supplier_Qava = sup.Supplier_ID_Qava

left join
(select ps.ID_SUPPLIER                  as ID_Supplier_Ekuep,
        ps.name                         as Supplier_Ekuep,
        listagg(distinct pa.CITY, ', ') as Supllier_City_Ekuep,
        ps.DATE_ADD                     as Supplier_Ekuep_Add
from EKUEP_KSA_EKUEP_STAGING.PS_SUPPLIER ps
left join (select * from EKUEP_KSA_EKUEP_STAGING.PS_ADDRESS) pa on pa.ID_SUPPLIER = ps.ID_SUPPLIER and pa._FIVETRAN_DELETED = 0
where ps.USED_SUPPLIER_ID is null and ps._FIVETRAN_DELETED = 0
group by ID_Supplier_Ekuep, Supplier_Ekuep, Supplier_Ekuep_Add) supc on supc.ID_Supplier_Ekuep = sup.Supplier_ID_Ekuep
where _FIVETRAN_DELETED = 0
group by wbd.WAYBILL_ID, sup.WAYBILL_NO,
       sup.Supplier_ID_Qava, supq.Supplier_Qava, supq.Supllier_City_Qava, supq.Supplier_Qava_Add,
       sup.Supplier_ID_Ekuep, supc.Supplier_Ekuep, supc.Supllier_City_Ekuep, supc.Supplier_Ekuep_Add

我得到的 Waybill_No = 43265104 的输出如下,我只想去掉空行。

WITH data(num, id) AS (
    SELECT * FROM VALUES
      (2559,    23),
      (2559,    33),
      (2559,    55),
      (2550,    89),
      (2499,    14),
      (2499,    14)
)
SELECT 
    num,
    id,
    count(*) over(partition by num) as num_dup,
    count(distinct id)over(partition by num) as id_dup,
    iff(num_dup > 1 AND num_dup = id_dup, 1, 0) as "check"
FROM data;

给出:

NUM ID NUM_DUP ID_DUP check
2559 23 3 3 1
2559 33 3 3 1
2559 55 3 3 1
2550 89 1 1 0
2499 14 2 1 0
2499 14 2 1 0

额外数据:

WITH data(num, id) AS (
    SELECT * FROM VALUES
      (2559,    23),
      (2559,    33),
      (2559,    33),
      (2559,    55),
      (2550,    89),
      (2499,    14),
      (2499,    14)
)
SELECT 
    num,
    id,
    count(*) over(partition by num) as num_dup,
    count(distinct id)over(partition by num) as id_dup,
    iff(num_dup > 1 AND num_dup = id_dup, 1, 0) as "check"
FROM data;

如果我们让 2559 有两个 33 然后它显示更改为 0/false

NUM ID NUM_DUP ID_DUP check
2559 23 4 3 0
2559 33 4 3 0
2559 33 4 3 0
2559 55 4 3 0
2550 89 1 1 0
2499 14 2 1 0
2499 14 2 1 0

最后一步:

WITH data(num, id) AS (
    SELECT * FROM VALUES
      (2559,    23),
      (2559,    33),
      (2559,    55),
      (2550,    89),
      (2499,    14),
      (2499,    14)
)
SELECT 
    num,
    iff(count(*) > 1 AND count(*) = count(distinct id), 1, 0) as output
FROM data
GROUP BY 1;

给出:

NUM OUTPUT
2559 1
2550 0
2499 0
    left join (
        select 
            ID, 
            ORDER_ID, 
            WAYBILL_NO 
        from ORDER_WAYBILLS
    ) ow 
        on wb.WAYBILL_ID = ow.id

应该只是:

    LEFT JOIN order_waybills AS ow
        ON wb.waybill_id = ow.id

Gaint 重构从这里开始

所以我开始重构这个 SQL,第一部分是忽略我之前的“这可能更简单”并将其移至 CTE ob_cte,所以它“很简单”然后我注意到前两个部分有大块,你记为 op 相同的地方,所以它变成了 CTE op_cte 也给了我们:

WITH ob_cte AS (
    SELECT 
        id, 
        order_id, 
        waybill_no 
    FROM order_waybills
), op_etc AS (
    SELECT 
        opr.id_order,
        opr.id_product,
        ss.id_supplier_ekuep,
        ss.id_supplier_qava
    FROM order_products AS opr
    LEFT JOIN (
        SELECT 
            s.id, 
            supc.id_supplier_ekuep, 
            supq.id_supplier_qava
        FROM suppliers AS s
        LEFT JOIN (
            SELECT 
                id_supplier AS id_supplier_ekuep
            FROM ekuep_ksa_ekuep_staging.ps_supplier 
            WHERE used_supplier_id IS NULL
        ) AS supc 
            ON supc.id_supplier_ekuep = s.id_supplier 
                AND s.store_id = 1
        LEFT JOIN (
            SELECT 
                id_supplier AS id_supplier_qava
            FROM qavashop_ksa_qavaish_mainshop.ps_supplier 
            WHERE used_supplier_id IS NULL
        ) AS supq 
            ON supq.id_supplier_qava = s.id_supplier
                AND s.store_id = 2
    ) AS ss 
        ON opr.SUPPLIER_ID = ss.ID
    GROUP BY opr.id_order, opr.id_product, ss.id_supplier_ekuep, ss.id_supplier_qava
)

SELECT 
    wbd.waybill_id, 
    sup.waybill_no,
    sup.supplier_id_qava, 
    supq.supplier_qava, 
    supq.supllier_city_qava, 
    supq.supplier_qava_add,
    sup.supplier_id_ekuep, 
    supc.supplier_ekuep, 
    supc.supllier_city_ekuep, 
    supc.supplier_ekuep_add
FROM waybill_products AS wbd
LEFT JOIN (
    SELECT 
        wb.waybill_id,
        ow.waybill_no,
        CASE 
            WHEN mult.multi_supp_qava = 1 THEN '1'
            WHEN mult.multi_supp_qava = 0 THEN op.ID_Supplier_Qava
            ELSE NULL 
        end as supplier_id_qava,
        case 
            WHEN mult.multi_supp_ekuep = 1 THEN '1'
            WHEN mult.multi_supp_ekuep = 0 THEN op.ID_Supplier_Ekuep
            ELSE NULL 
        END AS supplier_id_ekuep
    FROM waybill_products AS wb
    LEFT JOIN ob_cte AS ow 
        ON wb.waybill_id = ow.id
    LEFT JOIN op_etc AS op 
        ON op.id_product = wb.product_id 
            AND op.id_order = ow.order_id
    ------------------------------------------------------------------------------------------------------------------------
    left join (
        select 
            wb.WAYBILL_ID, 
            ow.WAYBILL_NO,
            (count(distinct op.ID_Supplier_Qava) > 1)::int as multi_supp_qava,
            (count(distinct op.ID_Supplier_Ekuep) > 1)::int as multi_supp_ekuep
        from WAYBILL_PRODUCTS wb
        LEFT JOIN ob_cte AS ow
            ON wb.waybill_id = ow.id
        left join op_etc AS op 
            on op.ID_PRODUCT = wb.PRODUCT_ID 
                and op.ID_ORDER = ow.ORDER_ID
        where _FIVETRAN_DELETED = 0
        group by wb.WAYBILL_ID, ow.WAYBILL_NO
    ) AS mult 
        on mult.WAYBILL_NO = ow.WAYBILL_NO
    ------------------------------------------------------------------------------------------------------------------------
    group by wb.WAYBILL_ID, ow.WAYBILL_NO, mult.multi_supp_qava, mult.multi_supp_ekuep, op.ID_Supplier_Qava, op.ID_Supplier_Ekuep
) AS sup 
    on wbd.WAYBILL_ID = sup.WAYBILL_ID
left join (
    select 
        ps.id_supplier                  AS id_supplier_qava,
        ps.name                         AS supplier_qava,
        ps.date_add                     AS supplier_qava_add,
        LISTAGG(DISTINCT pa.CITY, ', ') AS supllier_city_qava
    from QAVASHOP_KSA_QAVAISH_MAINSHOP.PS_SUPPLIER ps
    left join (
        select * 
        from QAVASHOP_KSA_QAVAISH_MAINSHOP.PS_ADDRESS
    ) pa 
        ON pa.ID_SUPPLIER = ps.ID_SUPPLIER 
            AND pa._fivetran_deleted = 0
    WHERE ps.USED_SUPPLIER_ID is null 
        AND ps._fivetran_deleted = 0
    GROUP BY 1, 2, 3
) AS supq 
    on supq.ID_Supplier_Qava = sup.Supplier_ID_Qava
left join (
    select 
        ps.id_supplier                  AS id_supplier_ekuep,
        ps.name                         AS supplier_ekuep,
        ps.date_add                     AS supplier_ekuep_add,
        LISTAGG(DISTINCT pa.CITY, ', ') AS supllier_city_ekuep
    FROM ekuep_ksa_ekuep_staging.ps_supplier AS ps
    LEFT JOIN FROM ekuep_ksa_ekuep_staging.ps_address AS pa 
        ON pa.id_supplier = ps.id_supplier 
            and pa._fivetran_deleted = 0
    WHERE ps.used_supplier_id IS NULL 
        and ps._fivetran_deleted = 0
    GROUP BY 1, 2, 4
) AS supc 
    ON supc.id_supplier_ekuep = sup.supplier_id_ekuep
WHERE _fivetran_deleted = 0
GROUP BY wbd.waybill_id, sup.waybill_no,
       sup.supplier_id_qava, supq.supplier_qava, 
       supq.supllier_city_qava, supq.supplier_qava_add,
       sup.supplier_id_ekuep, supc.supplier_ekuep, 
       supc.supllier_city_ekuep, supc.supplier_ekuep_add;

现在 op_etc 本身,末尾的 GROUP BY 实际上只是一个 DISTINCT,因此我们可以将其交换。同样在 ssop_cte

        SELECT 
            s.id, 
            supc.id_supplier_ekuep, 
            supq.id_supplier_qava
        FROM suppliers AS s
        LEFT JOIN (
            SELECT 
                id_supplier AS id_supplier_ekuep
            FROM ekuep_ksa_ekuep_staging.ps_supplier 
            WHERE used_supplier_id IS NULL
        ) AS supc 
            ON supc.id_supplier_ekuep = s.id_supplier 
                AND s.store_id = 1
        LEFT JOIN (
            SELECT 
                id_supplier AS id_supplier_qava
            FROM qavashop_ksa_qavaish_mainshop.ps_supplier 
            WHERE used_supplier_id IS NULL
        ) AS supq 
            ON supq.id_supplier_qava = s.id_supplier
                AND s.store_id = 2

那些要左连接的,只保留 NULL 的值,然后 LEFT JOIN 两个要求,这意味着我们每个供应商都有一行 IS NULL 可以移动到 ON 没有影响,这意味着重命名可以向上移动,并删除 sub-select,这样该部分就可以变成:

SELECT 
    s.id, 
    supc.id_supplier AS id_supplier_ekuep, 
    supq.id_supplier AS id_supplier_qava
FROM suppliers AS s
LEFT JOIN ekuep_ksa_ekuep_staging.ps_supplier AS supc 
    ON supc.id_supplier = s.id_supplier 
        AND s.store_id = 1 
        AND supc.used_supplier_id IS NULL
LEFT JOIN qavashop_ksa_qavaish_mainshop.ps_supplier AS supq 
    ON supq.id_supplier = s.id_supplier
        AND s.store_id = 2 
        AND supq.used_supplier_id IS NULL

因此 op_cte 变为:

), op_etc AS (
    SELECT DISTINCT
        opr.id_order,
        opr.id_product,
        ss.id_supplier_ekuep,
        ss.id_supplier_qava
    FROM order_products AS opr
    LEFT JOIN (
        SELECT 
            s.id, 
            supc.id_supplier AS id_supplier_ekuep, 
            supq.id_supplier AS id_supplier_qava
        FROM suppliers AS s
        LEFT JOIN ekuep_ksa_ekuep_staging.ps_supplier AS supc 
            ON supc.id_supplier = s.id_supplier 
                AND s.store_id = 1 
                AND supc.used_supplier_id IS NULL
        LEFT JOIN qavashop_ksa_qavaish_mainshop.ps_supplier AS supq 
            ON supq.id_supplier = s.id_supplier
                AND s.store_id = 2 
                AND supq.used_supplier_id IS NULL
    ) AS ss 
        ON opr.SUPPLIER_ID = ss.ID
)

这实际上意味着 ss 可以作为第一顺序加入,例如:

), op_etc AS (
    SELECT DISTINCT
        opr.id_order,
        opr.id_product,
        supc.id_supplier AS id_supplier_ekuep,
        supq.id_supplier AS id_supplier_qava
    FROM order_products AS opr
    LEFT JOIN suppliers AS s
        opr.SUPPLIER_ID = s.ID
    LEFT JOIN ekuep_ksa_ekuep_staging.ps_supplier AS supc 
        ON supc.id_supplier = s.id_supplier 
            AND s.store_id = 1 
            AND supc.used_supplier_id IS NULL
    LEFT JOIN qavashop_ksa_qavaish_mainshop.ps_supplier AS supq 
        ON supq.id_supplier = s.id_supplier
            AND s.store_id = 2 
            AND supq.used_supplier_id IS NULL
)

啊,爽多了..

in the sub-select sup` 我担心,您正在按不在输出集中的值进行分组,因此您会得到重复的行

在这种情况下块

CASE 
    WHEN mult.multi_supp_qava = 1 THEN '1'
    WHEN mult.multi_supp_qava = 0 THEN op.ID_Supplier_Qava
    ELSE NULL 
end as supplier_id_qava,

您不是按输出 supplier_id_qava 或其位置 3 分组,而是 mult.multi_supp_qava, op.ID_Supplier_Qava

所以如果 op.ID_Supplier_Qavamult.multi_supp_qava = 1 时不为空并且可以有不同的值,则 supplier_id_qava 将在两行上输出 1,但它们不会合并,因为 op.ID_Supplier_Qava 是不同的。这是我强烈不喜欢使用 SELECT 部分的输入作为这些值聚合的分组子句的根源。因为通过转换,它们可以在输出上变得相同,但在输入上保持不同,并且产生难以调试的去重。而如果翻转case他们总是safe/null/constant中的奇数case,这个就不清楚了SQLreader。 (在这一点上,我必须非常感谢你在 select 等上使用了别名,因为这总是对这些值的来源充满信心)。

因此,sup 上的 GROUP BY 再次没有值的聚合,因此这是一个隐藏的 DISTINCT,但它在所有情况下都没有给出不同的值 可能

因此,在将一些 sub-select 移动到 CTE 之后,我发现它使每个 select 层显示,它正在做什么,必须跳过更小的细节,我们得到 SQL 像这样:

WITH ob_cte AS (
    SELECT 
        id, 
        order_id, 
        waybill_no 
    FROM order_waybills
), op_etc AS (
    SELECT DISTINCT
        opr.id_order,
        opr.id_product,
        supc.id_supplier AS id_supplier_ekuep,
        supq.id_supplier AS id_supplier_qava
    FROM order_products AS opr
    LEFT JOIN suppliers AS s
        opr.SUPPLIER_ID = s.ID
    LEFT JOIN ekuep_ksa_ekuep_staging.ps_supplier AS supc 
        ON supc.id_supplier = s.id_supplier 
            AND s.store_id = 1 
            AND supc.used_supplier_id IS NULL
    LEFT JOIN qavashop_ksa_qavaish_mainshop.ps_supplier AS supq 
        ON supq.id_supplier = s.id_supplier
            AND s.store_id = 2 
            AND supq.used_supplier_id IS NULL
), mult_cte AS (
    SELECT 
        wb.waybill_id, 
        ow.waybill_no,
        (COUNT(DISTINCT op.id_supplier_qava) > 1)::int AS multi_supp_qava,
        (COUNT(DISTINCT op.id_supplier_ekuep) > 1)::int AS multi_supp_ekuep
    FROM waybill_products AS wb
    LEFT JOIN ob_cte AS ow
        ON wb.waybill_id = ow.id
    LEFT JOIN op_etc AS op 
        ON op.id_product = wb.product_id 
            AND op.id_order = ow.order_id
    WHERE _fivetran_deleted = 0
    GROUP BY wb.waybill_id, ow.waybill_no
), supq_cte AS (
    SELECT 
        ps.id_supplier                  AS id_supplier_qava,
        ps.name                         AS supplier_qava,
        ps.date_add                     AS supplier_qava_add,
        LISTAGG(DISTINCT pa.city, ', ') AS supllier_city_qava
    FROM qavashop_ksa_qavaish_mainshop.ps_supplier AS ps
    LEFT JOIN qavashop_ksa_qavaish_mainshop.ps_address AS pa 
        ON pa.id_supplier = ps.id_supplier 
            AND pa._fivetran_deleted = 0
    WHERE ps.used_supplier_id is null 
        AND ps._fivetran_deleted = 0
    GROUP BY 1, 2, 3
), supc_cte AS (
    SELECT 
        ps.id_supplier                  AS id_supplier_ekuep,
        ps.name                         AS supplier_ekuep,
        ps.date_add                     AS supplier_ekuep_add,
        LISTAGG(DISTINCT pa.city, ', ') AS supllier_city_ekuep
    FROM ekuep_ksa_ekuep_staging.ps_supplier AS ps
    LEFT JOIN FROM ekuep_ksa_ekuep_staging.ps_address AS pa 
        ON pa.id_supplier = ps.id_supplier 
            AND pa._fivetran_deleted = 0
    WHERE ps.used_supplier_id IS NULL 
        AND ps._fivetran_deleted = 0
    GROUP BY 1, 2, 4
), sup_cte AS (
    SELECT DISTINCT
        wb.waybill_id,
        ow.waybill_no,
        CASE 
            WHEN mult.multi_supp_qava = 1 THEN '1'
            WHEN mult.multi_supp_qava = 0 THEN op.ID_Supplier_Qava
            ELSE NULL 
        end as supplier_id_qava,
        case 
            WHEN mult.multi_supp_ekuep = 1 THEN '1'
            WHEN mult.multi_supp_ekuep = 0 THEN op.ID_Supplier_Ekuep
            ELSE NULL 
        END AS supplier_id_ekuep
    FROM waybill_products AS wb
    LEFT JOIN ob_cte AS ow 
        ON wb.waybill_id = ow.id
    LEFT JOIN op_etc AS op 
        ON op.id_product = wb.product_id 
            AND op.id_order = ow.order_id
    ------------------------------------------------------------------------------------------------------------------------
    LEFT JOIN mult_cte AS mult 
        on mult.WAYBILL_NO = ow.WAYBILL_NO
    ------------------------------------------------------------------------------------------------------------------------
)

SELECT 
    wbd.waybill_id, 
    sup.waybill_no,
    sup.supplier_id_qava, 
    supq.supplier_qava, 
    supq.supllier_city_qava, 
    supq.supplier_qava_add,
    sup.supplier_id_ekuep, 
    supc.supplier_ekuep, 
    supc.supllier_city_ekuep, 
    supc.supplier_ekuep_add
FROM waybill_products AS wbd
LEFT JOIN sup_cte AS sup 
    ON wbd.WAYBILL_ID = sup.WAYBILL_ID
LEFT JOIN supq_cte AS supq 
    ON supq.id_supplier_qava = sup.supplier_id_qava
LEFT JOIN supc_cte AS supc 
    ON supc.id_supplier_ekuep = sup.supplier_id_ekuep
WHERE _fivetran_deleted = 0
GROUP BY wbd.waybill_id, sup.waybill_no,
       sup.supplier_id_qava, supq.supplier_qava, 
       supq.supllier_city_qava, supq.supplier_qava_add,
       sup.supplier_id_ekuep, supc.supplier_ekuep, 
       supc.supllier_city_ekuep, supc.supplier_ekuep_add;

最后我们再次看到您正在遭受重复数据的困扰,您正试图用另一个 GROUP BY.. 清除。所以我们将切换到 DISTINCT

SELECT DISTINCT 
    wbd.waybill_id, 
    sup.waybill_no,
    sup.supplier_id_qava, 
    supq.supplier_qava, 
    supq.supllier_city_qava, 
    supq.supplier_qava_add,
    sup.supplier_id_ekuep, 
    supc.supplier_ekuep, 
    supc.supllier_city_ekuep, 
    supc.supplier_ekuep_add
FROM waybill_products AS wbd
LEFT JOIN sup_cte AS sup 
    ON wbd.WAYBILL_ID = sup.WAYBILL_ID
LEFT JOIN supq_cte AS supq 
    ON supq.id_supplier_qava = sup.supplier_id_qava
LEFT JOIN supc_cte AS supc 
    ON supc.id_supplier_ekuep = sup.supplier_id_ekuep
WHERE _fivetran_deleted = 0

好的,你的问题又是什么?

您想摆脱所有空值...如果这是“为什么有这么多左连接”或从 CASE 语句返回空值..

对所以在图片中显示一个 waybill_no 有值,另一个 supplier_id_qava 为空,因为后者来自

LEFT JOIN sup_cte AS sup 
    ON wbd.WAYBILL_ID = sup.WAYBILL_ID

和其他所有连接通过 sup 你应该把它从 LEFT JOIN 改为 JOIN