根据另一列的值删除一列上的重复值

时间:2021-06-29 23:38:31

标签: sql sql-server database tsql

我有一张名为 Table1 的表,见下文

PRODUCT    CUSTOMER               COMP
DICE       DAVES PET SHOP         Billed
DICE       CLAXTONS               ToT
CARDS      VIEWSONIC              NITS
CARDS      NORTHERN LIGHTS        Billed
CARDS      NORTHERN LIGHTS        NITS
BOX        TABLEAU                Billed
BOX        TABLEAU                ToT

有些值在 CUSTOMER 字段中存在重复项,但如果它是重复项,它将始终在至少一个 Billed 部分中包含 COMP,因此我希望结果查询仅返回 COMP 中的值,其中它是 Billed 的重复项,因此结果表看起来像

PRODUCT    CUSTOMER               COMP
DICE       DAVES PET SHOP         Billed
DICE       CLAXTONS               ToT
CARDS      VIEWSONIC              NITS
CARDS      NORTHERN LIGHTS        Billed
BOX        TABLEAU                Billed

这是我试过的 SQL

SELECT * 
FROM Table1
WHERE COMP = 'Billed'
UNION ALL
SELECT Table1_A.PRODUCT, Table1_A.CUSTOMER, Table1_A.COMP
FROM Table1 Table1_A
LEFT JOIN (
    SELECT * 
    FROM Table1 
    WHERE COMP != 'Billed'
) Table1_B ON Table1_B.PRODUCT = Table1_A.PRODUCT 
    AND Table1_B.CUSTOMER = Table1_A.CUSTOMER

我想如果我输入一个 UNION 并引用等于 Billed 而不等于 Billed,那么它会保留我正在寻找的格式,但它只是重复每一个 CUSTOMER 对于每一个 COMP

1 个答案:

答案 0 :(得分:1)

您可以为规则使用聚合:

SELECT PRODUCT, CUSTOMER, 
       (CASE WHEN COUNT(*) = 1 THEN MAX(COMP) ELSE 'Billed' END)
FROM table1 
GROUP BY PRODUCT, CUSTOMER;

您也可以使用 UNION ALL 方法:

select product, customer, comp
from table1 t1
where comp = 'Billed'
union all
select product, customer, comp
from table1 t1
where not exists (select 1
                  from table1 tt1
                  where tt1.product = t1.product and
                        tt1.customer = t1.customer and
                        tt1.comp = 'Billed'
                 );