我想在我的查询中添加一列,它将指定一行匹配的一个或多个类别。我想接受这个:
+--------------+---------------+
Row | Product | Quantity_Sold |
+--------------+---------------+
1 | Coca-Cola | 15 |
2 | Cigarettes | 4 |
3 | Pretzel | 6 |
4 | Beer | 25 |
5 | Popcorn | 10 |
6 | Candy Bar | 10 |
+--------------+---------------+
并返回:
+--------------+---------------+----------------------+
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 |
+--------------+---------------+----------------------+
请注意输出的第 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;
只会返回这个输出
+--------------+---------------+----------------------+
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 |
+--------------+---------------+----------------------+
(注意“啤酒”只出现一次)
那么我怎样才能让它在它匹配的所有类别的单独行上显示呢?
加入将是这里的最佳解决方案。
创建一个表,其中包含类别列表以及哪些产品与它们相关联,例如 Product、Category,我们将其称为 ProductCategories。然后加入这张桌子。
这有一个额外的好处,即当您添加更多类别时不必修改您的案例语句(这很快变得难以/不可能维护),并且只需要简单地插入新表。
由于您无法创建永久表,因此您可以使用 CTE 和连接。
谢谢你,Sethcran 和 Kenneth Fisher,他们各自提供了这个答案的一部分。我在这里找到了最后一个缺失的部分:Oracle 创建表使用 with 子句(堆栈溢出)
以下是最终奏效的方法: