Quero adicionar uma coluna à minha consulta que especificará uma ou mais categorias que uma linha corresponde. Eu quero levar isso:
+--------------+---------------+
Row | Product | Quantity_Sold |
+--------------+---------------+
1 | Coca-Cola | 15 |
2 | Cigarettes | 4 |
3 | Pretzel | 6 |
4 | Beer | 25 |
5 | Popcorn | 10 |
6 | Candy Bar | 10 |
+--------------+---------------+
E retorne isso:
+--------------+---------------+----------------------+
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 |
+--------------+---------------+----------------------+
Observe na linha 4-5 da saída, "Beer" está em duas linhas, porque se encaixa em duas categorias.
Se eu tentar fazer isso com CASE, apenas a primeira correspondência será contada.
Esta consulta
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;
Retornaria apenas esta saída
+--------------+---------------+----------------------+
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 |
+--------------+---------------+----------------------+
(Aviso "Cerveja" aparece apenas uma vez)
Então, como posso fazer com que ele apareça em linhas separadas para todas as categorias correspondentes?
Uma junção seria a melhor solução aqui.
Crie uma tabela que contenha uma lista de categorias e quais produtos estão associados a elas, algo como Product, Category que chamaremos de ProductCategories. Então junte-se a esta mesa.
Isso tem o benefício adicional de não ter que modificar sua instrução case à medida que você adiciona mais categorias (o que rapidamente se torna difícil/impossível de manter) e requer apenas uma simples inserção na nova tabela.
Como você não pode criar uma tabela permanente, você pode usar um CTE e uma junção.
Obrigado, Sethcran e Kenneth Fisher, por cada um fornecer partes desta resposta. Encontrei a última peça que faltava aqui: Oracle cria tabela usando a cláusula (Stack Overflow)
Aqui está o que finalmente funcionou: