# Processo de Extração de Dados de Vinho
### Introdução
Processo de extração de dados sobre vinhos. O objetivo é extrair dados relevantes para análise e relatórios sobre os produtos de vinho ativos e disponíveis no E-commerce.
### Tabelas Envolvidas:
* **PRODUCT**: Tabela que armazena informações sobre os produtos disponíveis, como *ID*, *SKU* e *nome do produto*.
* **SHELF_PRODUCT**: Tabela de associação entre prateleiras e produtos.
* **SHELF**: Tabela que contém informações sobre prateleiras, incluindo a URL do caminho da prateleira.
* **ATTRIBUTE_VALUE**: Tabela que armazena valores de atributos para produtos.
* **ATTRIBUTE_LABEL**: Tabela que contém os rótulos dos atributos.
* **ATTRIBUTE**: Tabela principal que define os atributos disponíveis, como o tipo de backend (por exemplo, opção, string, etc.).
* **ATTRIBUTE_OPTION**: Tabela que armazena opções para atributos do tipo 'opção'.
### Atributos considerados na extração:
| Code | Label | Type |
| -------- | -------- | -------- |
| Caracteristicas_gustativas | Características gustativas | text |
| Caracteristicas_olfativa | Características olfativas | text |
| Caracteristicas_visuais | Características visuais | text |
| Descricao | descricao | text |
| Harmonizacao_vinhos | Harmonização | text |
| Marca | Marca | option |
| produtor | Produtor | option |
| Regiao | Região | option |
| Temperatura | temperatura | varchar |
| teorAlcoolico | Teor Alcóolico | decimal |
| tipoUva | Tipo de uva | option |
| Variedade_de_uva | Variedade da uva | option |
### Passo a Passo para a Extração do Relatório:
1. Tabelas Temporárias
```sql
-- Antes de começar a extração, deletar tabelas temporárias caso existam
DROP TABLE IF EXISTS temp_wine_products;
DROP TABLE IF EXISTS temp_wine_attributes;
```
2. Extração de Informações de Produto
```sql
-- Extrai informações de produto para nova tabela temporária temp_wine_products
CREATE TABLE temp_wine_products AS
SELECT DISTINCT
p.ID,
p.SKU,
p.NAME
FROM
PRODUCT p
JOIN
SHELF_PRODUCT sp ON sp.PRODUCT_ID = p.ID
JOIN
SHELF s ON sp.SHELF_PRODUCT_LIST_ID = s.ID
WHERE
s.PATH_URL LIKE '%vinho%'
AND p.PRODUCT_TYPE_ID = 1
AND EXISTS (
SELECT 1
FROM ATTRIBUTE_VALUE AV
WHERE AV.ATTRIBUTE_CODE = 'status'
AND AV.INT_VALUE = (SELECT ao.ID FROM ATTRIBUTE_OPTION ao WHERE ao.name = 'enable')
AND AV.PRODUCT_ID = P.ID
)
ORDER BY p.NAME DESC;
```
* Consulta a tabela **PRODUCT**, juntamente com as tabelas de associação **SHELF_PRODUCT** e **SHELF**, para obter informações sobre produtos de vinho.
* Os critérios de seleção incluem produtos que estão associados a prateleiras contendo "*vinho*" em sua URL de caminho e que possuem **PRODUCT_TYPE_ID = 1**, ou seja, produtos simples.
* Os produtos também são filtrados com base em um atributo específico ('status') para garantir que *apenas produtos ativos* sejam considerados.
* Os resultados são ordenados pelo nome do produto.
3. Extração de Informações de Atributo
```sql
-- Extrai informações de atributos para nova tabela temporária temp_wine_attributes
CREATE TABLE temp_wine_attributes AS
SELECT
av.PRODUCT_ID,
av.ATTRIBUTE_ID,
al.LABEL,
av.ATTRIBUTE_CODE,
a.BACKEND_TYPE,
CASE
WHEN a.BACKEND_TYPE = 'option' THEN (
SELECT ao.NAME FROM ATTRIBUTE_OPTION ao WHERE ao.ID = av.INT_VALUE
)
ELSE av.STRING_VALUE
END AS string_value,
av.TEXT_VALUE,
av.INT_VALUE,
av.DOUBLE_VALUE,
av.DATE_VALUE,
av.STORE_ID
FROM
ATTRIBUTE_VALUE av
JOIN
ATTRIBUTE_LABEL al ON al.ATTRIBUTE_ID = av.ATTRIBUTE_ID
JOIN
ATTRIBUTE a ON a.ID = av.ATTRIBUTE_ID
WHERE
av.PRODUCT_ID IN (SELECT twp.ID FROM TEMP_WINE_PRODUCTS twp)
AND av.ATTRIBUTE_CODE IN (
'Caracteristicas_gustativas',
'Caracteristicas_olfativa',
'Caracteristicas_visuais',
'Descricao',
'Harmonizacao_vinhos',
'Marca',
'produtor',
'Regiao',
'Temperatura',
'teorAlcoolico',
'tipoUva',
'Variedade_de_uva'
)
ORDER BY av.ATTRIBUTE_CODE ASC;
```
* Os atributos relevantes para os produtos de vinho são selecionados da tabela **ATTRIBUTE_VALUE**.
* Os critérios de seleção incluem a referência aos produtos de vinho extraídos na etapa anterior e uma lista específica de códigos de atributos relevantes para vinhos.
* Os resultados são ordenados pelo código do atributo.
4. Extração de Relatório
```sql
-- Realiza extração de relatório
SELECT
twp.SKU,
twp.NAME AS product_name,
twp.ID AS product_id,
twa.label AS attribute_name,
twa.ATTRIBUTE_CODE,
twa.ATTRIBUTE_ID,
twa.string_value,
twa.TEXT_VALUE,
twa.INT_VALUE,
twa.DOUBLE_VALUE,
twa.DATE_VALUE,
twa.STORE_ID
FROM
TEMP_WINE_PRODUCTS twp
JOIN
temp_wine_attributes twa ON twp.ID = twa.PRODUCT_ID
ORDER BY twp.SKU;
```
* Combinação das tabelas temporárias de produtos e atributos para criar um relatório completo.
* Os resultados incluem **SKU**, **nome do produto**, **ID** do produto e informações sobre cada atributo relevante, como nome do atributo, valor de string, valor de texto, etc.
* Os resultados são ordenados pelo SKU do produto.