从多个 CASE 匹配项上的匹配返回多行?

Nat*_*Lee 6 case

我想在我的查询中添加一列,该列将指定一行匹配的一个或多个类别。我想拿这个:

    +--------------+---------------+
Row | Product      | Quantity_Sold |
    +--------------+---------------+
1   | Coca-Cola    | 15            |
2   | Cigarettes   | 4             |
3   | Pretzel      | 6             |
4   | Beer         | 25            |
5   | Popcorn      | 10            |
6   | Candy Bar    | 10            |
    +--------------+---------------+
Run Code Online (Sandbox Code Playgroud)

并返回:

    +--------------+---------------+----------------------+
Row | Product      | Quantity_Sold | Category             |
    +--------------+---------------+----------------------+
1   | Coca-Cola    | 15            | Beverages            |
2   | Cigarettes   | 4             | Controlled Substance |
3   | Pretzel      | 6             | Snacks               |
4   | Beer         | 25            | Beverages            |
5   | Beer         | 25            | Controlled Substance |
6   | Popcorn      | 10            | Snacks               |
7   | Candy Bar    | 10            | Snacks               |
    +--------------+---------------+----------------------+
Run Code Online (Sandbox Code Playgroud)

注意输出的第 4-5 行,“Beer”在两行上,因为它适合两个类别。

如果我尝试使用 CASE 执行此操作,则只会计算第一场比赛。

这个查询

SELECT
    Product,
    Quantity_Sold,
    CASE
        WHEN
            Product IN ('Coca-Cola', 'Beer')
        THEN
            'Beverages'
    CASE
        WHEN
            Product IN ('Pretzel', 'Popcorn', 'Candy Bar')
        THEN
            'Snacks'
    CASE
        WHEN
            Product IN ('Cigarettes', 'Beer')
        THEN
            'Controlled Substance'
    END
        AS Category
FROM sales_table;
Run Code Online (Sandbox Code Playgroud)

只会返回这个输出

    +--------------+---------------+----------------------+
Row | Product      | Quantity_Sold | Category             |
    +--------------+---------------+----------------------+
1   | Coca-Cola    | 15            | Beverages            |
2   | Cigarettes   | 4             | Controlled Substance |
3   | Pretzel      | 6             | Snacks               |
4   | Beer         | 25            | Beverages            |
5   | Popcorn      | 10            | Snacks               |
6   | Candy Bar    | 10            | Snacks               |
    +--------------+---------------+----------------------+
Run Code Online (Sandbox Code Playgroud)

(注意“啤酒”只出现一次)

那么我怎样才能让它显示在它匹配的所有类别的单独行上?

Set*_*ran 6

加入将是最好的解决方案。

创建一个表,其中包含一个类别列表以及哪些产品与它们相关联,例如 Product、Category,我们将其称为 ProductCategories。然后加入这张桌子。

SELECT p.Product, p.Quantity_Sold, pc.Category
FROM sales_table p
JOIN ProductCategories pc ON pc.Product = p.Product'
Run Code Online (Sandbox Code Playgroud)

这有一个额外的好处,即当您添加更多类别(这很快变得难以/无法维护)时不必修改您的 case 语句,并且只需要简单地插入到新表中。