我想在我的查询中添加一列,该列将指定一行匹配的一个或多个类别。我想拿这个:
+--------------+---------------+
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)
(注意“啤酒”只出现一次)
那么我怎样才能让它显示在它匹配的所有类别的单独行上?
加入将是最好的解决方案。
创建一个表,其中包含一个类别列表以及哪些产品与它们相关联,例如 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 语句,并且只需要简单地插入到新表中。
| 归档时间: |
|
| 查看次数: |
41375 次 |
| 最近记录: |