diff --git a/aprendizado/modulo2_groupby.md b/aprendizado/modulo2_groupby.md new file mode 100644 index 0000000..ba83037 --- /dev/null +++ b/aprendizado/modulo2_groupby.md @@ -0,0 +1,114 @@ +# Módulo 2 — GROUP BY e Funções Agregadas + +> Continuação do caderno de SQL. Preencher conforme avança nos estudos. + +--- + +## 1. O que é agregação + +Transforma **várias linhas** de um grupo em **um único valor** de resumo. + +| Função | O que faz | +|--------|-----------| +| `COUNT(*)` | conta linhas (inclui nulas) | +| `COUNT(col)` | conta valores não-nulos da coluna | +| `SUM(col)` | soma | +| `AVG(col)` | média | +| `MIN(col)` / `MAX(col)` | mínimo / máximo | + +--- + +## 2. GROUP BY — particiona o conjunto em subconjuntos + +Quebra a tabela em grupos pela(s) coluna(s) indicada. **Toda coluna do SELECT que não é agregada PRECISA estar no GROUP BY.** + +```sql +SELECT COD_CLIENTE, COUNT(*) AS qtd_contas +FROM contas +GROUP BY COD_CLIENTE; +``` + +Esquema (teoria dos conjuntos): o conjunto total é particionado em subconjuntos disjuntos por `COD_CLIENTE`. + +--- + +## 3. WHERE vs HAVING (revisão da ordem de execução) + +- `WHERE` filtra **linhas** ANTES de agrupar (não aceita agregação). +- `HAVING` filtra **grupos** DEPOIS de agrupar (aceita agregação). + +```sql +SELECT COD_CLIENTE, COUNT(*) AS qtd +FROM contas +WHERE TIPO_CONTA = 'PF' +GROUP BY COD_CLIENTE +HAVING COUNT(*) > 1; +``` + +--- + +## 4. Exemplos no Banvic (já validados) + +> Sintaxe Databricks/Spark SQL. Colunas em MAIÚSCULAS (igual ao schema). +> Mais exemplos em `Módulo 0 - Banco de Dados BanVic/banvic_queries.md`. + +**GROUP BY simples — saldo médio por UF:** +```sql +SELECT l.UF, + COUNT(*) AS NUM_CONTAS, + ROUND(AVG(c.SALDO_TOTAL), 2) AS SALDO_MEDIO +FROM erp_banvic.contas c +JOIN erp_banvic.clientes cl ON cl.COD_CLIENTE = c.COD_CLIENTE +JOIN erp_banvic.localidades l ON l.COD_LOCALIDADE = cl.COD_LOCALIDADE +GROUP BY l.UF +ORDER BY SALDO_MEDIO DESC; +``` + +**WHERE (linhas) vs HAVING (grupo) — clientes com mais de 1 conta:** +```sql +SELECT COD_CLIENTE, COUNT(*) AS QTD_CONTAS +FROM erp_banvic.contas +WHERE TIPO_CONTA = 'PF' -- filtra LINHAS antes de agrupar +GROUP BY COD_CLIENTE +HAVING COUNT(*) > 1; -- filtra o GRUPO depois de agrupar +``` + +**COUNT(*) vs COUNT(col) — FK órfã (conta sem cliente):** +```sql +SELECT COUNT(*) AS total_linhas, + COUNT(COD_CLIENTE) AS com_cliente +FROM erp_banvic.contas; +-- diferença = contas com COD_CLIENTE nulo (COUNT(col) ignora nulos) +``` + +**Agregação + GROUP BY — volume de transações por tipo:** +```sql +SELECT NOME_TRANSACAO, + COUNT(*) AS QTD, + ROUND(SUM(VALOR_TRANSACAO), 2) AS TOTAL +FROM erp_banvic.transacoes +GROUP BY NOME_TRANSACAO +ORDER BY QTD DESC; +``` + +## 5. Exercícios para praticar + +- [x] Total de contas por `TIPO_CONTA` +- [ ] Saldo médio por agência (`contas` + `agencias`) +- [x] Clientes com mais de 1 conta (`HAVING COUNT(*) > 1`) +- [x] Soma de `VALOR_TRANSACAO` por `NOME_TRANSACAO` (tabela `transacoes`) + +--- + +## 5. Window Functions (próximo após agregações) + +`FUNCAO() OVER (PARTITION BY ... ORDER BY ...)` — calcula sobre uma "janela" sem +colapsar as linhas. Ex: `ROW_NUMBER()`, `RANK()`, `SUM() OVER (...)`. + +--- + +## Checklist +- [x] Escrever GROUP BY simples (saldo médio por UF) +- [x] Usar HAVING com agregação (clientes c/ >1 conta) +- [x] Diferenciar COUNT(*) de COUNT(col) (FK órfã) +- [ ] Primeira Window Function no Banvic (ver `RANK() OVER` em banvic_queries.md) diff --git a/aprendizado/modulo2_sql.md b/aprendizado/modulo2_sql.md new file mode 100644 index 0000000..9de6f02 --- /dev/null +++ b/aprendizado/modulo2_sql.md @@ -0,0 +1,138 @@ +# Módulo 2 — SQL: Caderno de Estudos + +> Notas vivas do Módulo 2 (Consultando dados com SQL). Atualizar a cada conceito novo. +> Referência prática: banco fictício **Banvic** (tabelas em `seeds/banvic/`). + +--- + +## 1. Aliases (renomeação / apelidos) + +A sintaxe é sempre `objeto apelido` (o `AS` é opcional). + +| Onde | Exemplo | Efeito | +|------|---------|--------| +| **Tabela** (FROM/JOIN) | `FROM contas c` | apelida a tabela para referenciar colunas | +| **Coluna** (SELECT) | `c.SALDO_TOTAL AS saldo` | renomeia a **saída** exibida | +| **CTE** | `WITH contas_pf AS (SELECT ...)` | nomeia uma subquery inteira | +| **Subquery** (FROM) | `FROM (SELECT ...) t` | tabela derivada precisa de apelido | + +Exemplo Banvic (CTE + tabela + coluna): +```sql +WITH contas_ativas AS ( + SELECT NUM_CONTA, COD_CLIENTE, SALDO_TOTAL + FROM contas + WHERE SALDO_TOTAL > 0 +) +SELECT ca.NUM_CONTA AS num_conta, + cl.PRIMEIRO_NOME || ' ' || cl.ULTIMO_NOME AS nome_cliente, + ca.SALDO_TOTAL AS saldo +FROM contas_ativas ca +INNER JOIN clientes cl + ON cl.COD_CLIENTE = ca.COD_CLIENTE +ORDER BY ca.SALDO_TOTAL DESC; +``` +> `||` é o operador de concatenação no Databricks/Spark SQL. + +--- + +## 2. Ordem de ESCRITA vs EXECUÇÃO + +**Escrita (sintaxe fixa):** +``` +SELECT → FROM → JOIN → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT +``` + +**Execução (lógica do banco):** +``` +FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT +``` + +Regras práticas que vêm daí: +- `WHERE` filtra **antes** de agrupar; `HAVING` filtra o **grupo** (depois). +- `WHERE` **não** aceita função agregada (`COUNT`, `SUM`...). +- Alias do `SELECT` **não** existe em `WHERE`/`GROUP BY`, mas **existe** em `ORDER BY`. + +```sql +-- ERRADO no Spark SQL: +SELECT SALDO_TOTAL AS saldo FROM contas WHERE saldo > 0; +-- CERTO: +SELECT SALDO_TOTAL AS saldo FROM cont…… WHERE SALDO_TOTAL > 0 ORDER BY saldo; +``` + +--- + +## 3. INNER JOIN — interseção (∩) + +Só traz linhas onde a chave combina **nos dois** lados. O que não tem par, some. + +```sql +SELECT c.NUM_CONTA, cl.PRIMEIRO_NOME +FROM contas c +INNER JOIN clientes cl + ON cl.COD_CLIENTE = c.COD_CLIENTE; +``` +`ON` = regra do encontro (a FK em comum). No Banvic: `COD_CLIENTE`, `COD_AGENCIA`, `NUM_CONTA`. + +Esquema: +``` +contas: [A, B, C, D] +clientes: [B, C, E] +INNER → [B, C] +``` + +--- + +## 4. LEFT vs RIGHT JOIN + +| Tipo | Traz | +|------|------| +| **INNER** | só o que bate nos dois | +| **LEFT** | **tudo da esquerda** + o que casar da direita (NULL se não achar) | +| **RIGHT** | tudo da direita + o que casar da esquerda | +| **FULL** | tudo dos dois (NULL onde não bater) | + +**"LEFT" é literal:** é a tabela à esquerda do `JOIN` (a do `FROM`). +```sql +FROM clientes cl LEFT JOIN contas c -- cl nunca some +``` +`RIGHT JOIN` é redundante (sempre dá pra reescrever como LEFT trocando a ordem). Por isso quase ninguém usa. + +Esquema: +``` +contas: [A,B,C,D] clientes: [B,C,E] +LEFT (de contas) → [A,B,C,D] +RIGHT (de contas) → [B,C,E] +``` + +--- + +## 5. UNION vs UNION ALL — empilha (vertical) + +Diferente do JOIN (horizontal, colunas lado a lado), UNION **empilha linhas**. + +| | Efeito | Conjunto | +|--|--------|----------| +| **UNION** | empilha e **remove duplicatas** | união ∪ | +| **UNION ALL** | empilha **tudo** (inclusive repetidos) | concatena listas | + +Regras obrigatórias: mesma **quantidade**, **ordem** e **tipos** de colunas. + +Exemplo Banvic (clientes + colaboradores têm `PRIMEIRO_NOME, ULTIMO_NOME, EMAIL`): +```sql +SELECT PRIMEIRO_NOME, ULTIMO_NOME, EMAIL, 'cliente' AS tipo FROM clientes +UNION ALL +SELECT PRIMEIRO_NOME, ULTIMO_NOME, EMAIL, 'colaborador' AS tipo FROM colaboradores; +``` + +**UNION (vertical) vs JOIN (horizontal):** +- JOIN: colunas das tabelas na mesma linha. +- UNION: linhas das tabelas empilhadas. + +--- + +## Checklist de fixação +- [ ] Escrever query com alias de tabela + coluna +- [ ] Escrever CTE +- [ ] INNER JOIN entre 2 tabelas Banvic +- [ ] LEFT JOIN mostrando clientes sem conta (NULL) +- [ ] UNION ALL de clientes + colaboradores diff --git a/aprendizado/setup_execucao.md b/aprendizado/setup_execucao.md new file mode 100644 index 0000000..ab42e42 --- /dev/null +++ b/aprendizado/setup_execucao.md @@ -0,0 +1,87 @@ +# Setup de Execução (Databricks + dbt) — fazer DEPOIS de estudar a teoria + +> Este arquivo é um **lembrete de como rodar de fato** o projeto. Não é necessário +> durante o estudo de SQL via chat. Use quando quiser executar queries/seed/run no banco. + +--- + +## Pré-requisitos + +- Conta Databricks (a do trabalho já serve — catálogo `mesh_dev_db`, schema base `dev_carlos_castro_dbt`) +- `dbt-databricks` instalado (`pip install dbt-databricks`) +- dbt no PATH: `C:\Users\Jesse\AppData\Roaming\Python\Python314\Scripts` + +--- + +## 1. Criar o `profiles.yml` (FORA do repo) + +Local: `C:\Users\Jesse\.dbt\profiles.yml` + +```yaml +default: + target: dev + outputs: + dev: + type: databricks + catalog: mesh_dev_db + schema: dev_carlos_castro_dbt + host: .cloud.databricks.com + http_path: /sql/1.0/warehouses/ + token: + threads: 4 +``` + +Onde pegar: +- **host** → URL do workspace (sem `https://`) +- **http_path** → SQL → Warehouses → seu warehouse → Connection details +- **token** → Settings (⚙️) → Developer → Access tokens → Generate + +⚠️ **NUNCA** commite o `profiles.yml` (tem token = senha). Ele fica fora do repo. + +--- + +## 2. Validar conexão + +```bash +cd +dbt debug +``` +Se der OK, a ponte está feita. + +--- + +## 3. Carregar as tabelas do Banvic (seeds) + +As seeds estão desabilitadas por padrão em `dbt_project.yml` (`+enabled: false`). +Carregar uma por uma: +```bash +dbt seed -s clientes +dbt seed -s contas +dbt seed -s transacoes +dbt seed -s agencias +dbt seed -s localidades +dbt seed -s colaboradores +dbt seed -s colaborador_agencia +dbt seed -s propostas_credito +``` +(Schemas criados: `mesh_dev_db.erp_banvic` para as seeds.) + +--- + +## 4. Rodar models e testes + +```bash +dbt run --select staging # camada staging +dbt run --select +marts.fact_transacoes +dbt test # validação de qualidade +``` + +--- + +## 5. Onde rodar queries ad-hoc (SQL puro do Módulo 2) + +No Databricks: **SQL → Query Editor** → aponte pro catálogo `mesh_dev_db` e pro schema +das tabelas (`erp_banvic` após o seed, ou `dev_carlos_castro_dbt_staging` após o run). +É lá que você pratica os `SELECT`/`JOIN`/`UNION` do caderno `modulo2_sql.md`. + +> Enquanto estuda só a teoria, não precisa de nada disso — o chat já serve. diff --git a/dbt_project.yml b/dbt_project.yml index f406585..5797c20 100644 --- a/dbt_project.yml +++ b/dbt_project.yml @@ -39,4 +39,4 @@ seeds: my_new_project: # <-- Name of the project. If you renamed your project you have to change this as well banvic: +schema: erp_banvic - +enabled: false \ No newline at end of file + +enabled: true \ No newline at end of file diff --git a/models/intermediate/int_dimensao_agencias.sql b/models/intermediate/int_dimensao_agencias.sql new file mode 100644 index 0000000..39db2cd --- /dev/null +++ b/models/intermediate/int_dimensao_agencias.sql @@ -0,0 +1,24 @@ +with +agencias as ( + select * + from {{ ref('stg_erp__agencias') }} +), + +localidades as ( + select * + from {{ ref('stg_erp__localidades') }} +), + +agencias_enriquecido as ( + select + agencias.pk_agencia + , agencias.nome_agencia + , agencias.tipo_agencia + , localidades.cidade as cidade_agencia + , localidades.uf as uf_agencia + from agencias + left join localidades on agencias.fk_localidade = localidades.pk_localidade +) + +select * +from agencias_enriquecido \ No newline at end of file diff --git a/models/intermediate/int_dimensao_clientes.sql b/models/intermediate/int_dimensao_clientes.sql new file mode 100644 index 0000000..c0b0344 --- /dev/null +++ b/models/intermediate/int_dimensao_clientes.sql @@ -0,0 +1,30 @@ +with +clientes as ( + select * + from {{ ref('stg_erp__clientes') }} +), + +localidades as ( + select * + from {{ ref('stg_erp__localidades') }} +), + +clientes_enriquecido as ( + select + clientes.pk_cliente + , clientes.nome_cliente + , clientes.email_cliente + , clientes.tipo_cliente + , clientes.cpfcnpj_cliente + , clientes.ts_inclusao + , clientes.data_nascimento_cliente + , clientes.endereco_cliente + , clientes.cep_cliente + , localidades.cidade as cidade_cliente + , localidades.uf as uf_cliente + from clientes + left join localidades on clientes.fk_localidade = localidades.pk_localidade +) + +select * +from clientes_enriquecido \ No newline at end of file diff --git a/models/intermediate/int_dimensao_colaboradores.sql b/models/intermediate/int_dimensao_colaboradores.sql new file mode 100644 index 0000000..d8e597d --- /dev/null +++ b/models/intermediate/int_dimensao_colaboradores.sql @@ -0,0 +1,18 @@ +with +fonte_colaboradores as ( + select * + from {{ source('erp', 'colaboradores') }} +), + +renomeado as ( + select + cast(cod_colaborador as int) as pk_colaborador + , cast(cod_localidade as int) as fk_localidade + , primeiro_nome || ' ' || ultimo_nome as nome_colaborador + , email as email_colaborador + , cast(cod_gerente as int) as fk_gerente + from fonte_colaboradores +) + +select * +from renomeado \ No newline at end of file diff --git a/models/intermediate/int_dimensao_contas.sql b/models/intermediate/int_dimensao_contas.sql new file mode 100644 index 0000000..6571535 --- /dev/null +++ b/models/intermediate/int_dimensao_contas.sql @@ -0,0 +1,17 @@ +with +contas as ( + select * + from {{ ref('stg_erp__contas') }} +), + +selecionar_colunas as ( + select + pk_conta + , numero_conta + , tipo_conta + , ts_abertura_conta + from contas +) + +select * +from contas \ No newline at end of file diff --git a/models/intermediate/int_dimensao_datas.sql b/models/intermediate/int_dimensao_datas.sql new file mode 100644 index 0000000..5686473 --- /dev/null +++ b/models/intermediate/int_dimensao_datas.sql @@ -0,0 +1,29 @@ +with +date_spine as ( + {{ + dbt_utils.date_spine( + datepart="day", + start_date="cast('2000-01-01' as date)", + end_date="cast('2030-01-01' as date)" + ) + }} +), + +criar_datas as ( + select + row_number() over(order by date_day) as pk_data + , cast(date_day as date) as dt_data + , extract(day from date_day) as dia + , extract(month from date_day) as mes + , extract(year from date_day) as ano + , extract(quarter from date_day) as trimestre + , extract(dow from date_day) as dia_da_semana + , case + when extract(dow from date_day) in (0, 6) then true + else false + end as is_final_de_semana + from date_spine +) + +select * +from criar_datas \ No newline at end of file diff --git a/models/intermediate/int_fato_contas.sql b/models/intermediate/int_fato_contas.sql new file mode 100644 index 0000000..0c97272 --- /dev/null +++ b/models/intermediate/int_fato_contas.sql @@ -0,0 +1,19 @@ +with +contas as ( + select * + from {{ ref('stg_erp__contas') }} +), + +selecionar_colunas as ( + select + pk_conta + , fk_cliente + , fk_agencia + , saldo_total + , saldo_disponivel + , ts_ultimo_lancamento + from contas +) + +select * +from contas \ No newline at end of file diff --git a/models/intermediate/int_fato_transacoes.sql b/models/intermediate/int_fato_transacoes.sql new file mode 100644 index 0000000..b8bbd36 --- /dev/null +++ b/models/intermediate/int_fato_transacoes.sql @@ -0,0 +1,34 @@ +with +transacoes as ( + select * + from {{ ref('stg_erp__transacoes') }} +), + +contas as ( + select * + from {{ ref('stg_erp__contas') }} +), + +datas as ( + select * + from {{ ref('int_dimensao_datas') }} +), + +fato_transacoes as ( + select + transacoes.pk_transacao + , transacoes.fk_conta + , contas.fk_cliente + , contas.fk_agencia + , contas.fk_colaborador + , datas.pk_data as fk_data + , transacoes.ts_transacao + , transacoes.nome_transacao + , transacoes.valor_transacao + from transacoes + left join contas on transacoes.fk_conta = contas.pk_conta + left join datas on cast(transacoes.ts_transacao as date) = datas.dt_data +) + +select * +from fato_transacoes diff --git a/models/marts/dim_agencias.sql b/models/marts/dim_agencias.sql new file mode 100644 index 0000000..53bf200 --- /dev/null +++ b/models/marts/dim_agencias.sql @@ -0,0 +1,8 @@ +with +agencias as ( + select * + from {{ ref('int_dimensao_agencias') }} +) + +select * +from agencias \ No newline at end of file diff --git a/models/marts/dim_clientes.sql b/models/marts/dim_clientes.sql new file mode 100644 index 0000000..43320fb --- /dev/null +++ b/models/marts/dim_clientes.sql @@ -0,0 +1,8 @@ +with +clientes as ( + select * + from {{ ref('int_dimensao_clientes') }} +) + +select * +from clientes \ No newline at end of file diff --git a/models/marts/dim_colaboradores.sql b/models/marts/dim_colaboradores.sql new file mode 100644 index 0000000..1fed120 --- /dev/null +++ b/models/marts/dim_colaboradores.sql @@ -0,0 +1,8 @@ +with +colaboradores as ( + select * + from {{ ref('int_dimensao_colaboradores') }} +) + +select * +from colaboradores \ No newline at end of file diff --git a/models/marts/dim_contas.sql b/models/marts/dim_contas.sql new file mode 100644 index 0000000..c44f31a --- /dev/null +++ b/models/marts/dim_contas.sql @@ -0,0 +1,8 @@ +with +dim_contas as ( + select * + from {{ ref('int_dimensao_contas') }} +) + +select * +from dim_contas \ No newline at end of file diff --git a/models/marts/dim_datas.sql b/models/marts/dim_datas.sql new file mode 100644 index 0000000..2358336 --- /dev/null +++ b/models/marts/dim_datas.sql @@ -0,0 +1,8 @@ +with +datas as ( + select * + from {{ ref('int_dimensao_datas') }} +) + +select * +from datas diff --git a/models/marts/fact_transacoes.sql b/models/marts/fact_transacoes.sql new file mode 100644 index 0000000..3682fde --- /dev/null +++ b/models/marts/fact_transacoes.sql @@ -0,0 +1,8 @@ +with +transacoes as ( + select * + from {{ ref('int_fato_transacoes') }} +) + +select * +from transacoes diff --git a/models/marts/schema/dim_agencias.yml b/models/marts/schema/dim_agencias.yml new file mode 100644 index 0000000..887742a --- /dev/null +++ b/models/marts/schema/dim_agencias.yml @@ -0,0 +1,9 @@ +models: + - name: dim_agencias + description: Modelo dimensão de agências. + columns: + - name: pk_agencia + description: Chave primária da agência. + data_tests: + - unique + - not_null \ No newline at end of file diff --git a/models/marts/schema/dim_clientes.yml b/models/marts/schema/dim_clientes.yml new file mode 100644 index 0000000..502849a --- /dev/null +++ b/models/marts/schema/dim_clientes.yml @@ -0,0 +1,9 @@ +models: + - name: dim_clientes + description: Modelo dimensão de clientes. + columns: + - name: pk_cliente + description: Chave primária do cliente. + data_tests: + - unique + - not_null \ No newline at end of file diff --git a/models/marts/schema/dim_colaboradores.yml b/models/marts/schema/dim_colaboradores.yml new file mode 100644 index 0000000..904171d --- /dev/null +++ b/models/marts/schema/dim_colaboradores.yml @@ -0,0 +1,9 @@ +models: + - name: dim_colaboradores + description: Modelo dimensão de colaboradores. + columns: + - name: pk_colaborador + description: Chave primária do colaborador. + data_tests: + - unique + - not_null \ No newline at end of file diff --git a/models/marts/schema/dim_datas.yml b/models/marts/schema/dim_datas.yml new file mode 100644 index 0000000..b8d932d --- /dev/null +++ b/models/marts/schema/dim_datas.yml @@ -0,0 +1,9 @@ +models: + - name: dim_datas + description: Modelo dimensão de datas. + columns: + - name: pk_data + description: Chave primária da data. + data_tests: + - unique + - not_null diff --git a/models/marts/schema/fact_transacoes.yml b/models/marts/schema/fact_transacoes.yml new file mode 100644 index 0000000..e72c5a8 --- /dev/null +++ b/models/marts/schema/fact_transacoes.yml @@ -0,0 +1,9 @@ +models: + - name: fact_transacoes + description: Modelo fato de transações. + columns: + - name: pk_transacao + description: Chave primária da transação. + data_tests: + - unique + - not_null diff --git a/models/my_first_dbt_model.sql b/models/my_first_dbt_model.sql deleted file mode 100644 index d3ca4ba..0000000 --- a/models/my_first_dbt_model.sql +++ /dev/null @@ -1,27 +0,0 @@ - -/* - Welcome to your first dbt model! - Did you know that you can also configure models directly within SQL files? - This will override configurations stated in dbt_project.yml - - Try changing "table" to "view" below -*/ - -{{ config(materialized='table') }} - -with source_data as ( - - select 1 as id - union all - select null as id - -) - -select * -from source_data - -/* - Uncomment the line below to remove records with null `id` values -*/ - --- where id is not null \ No newline at end of file diff --git a/models/my_second_dbt_model.sql b/models/my_second_dbt_model.sql deleted file mode 100644 index c91f879..0000000 --- a/models/my_second_dbt_model.sql +++ /dev/null @@ -1,6 +0,0 @@ - --- Use the `ref` function to select from other models - -select * -from {{ ref('my_first_dbt_model') }} -where id = 1 diff --git a/models/schema.yml b/models/schema.yml deleted file mode 100644 index 11c4447..0000000 --- a/models/schema.yml +++ /dev/null @@ -1,21 +0,0 @@ - -version: 2 - -models: - - name: my_first_dbt_model - description: "A starter dbt model" - columns: - - name: id - description: "The primary key for this table" - tests: - - unique - - not_null - - - name: my_second_dbt_model - description: "A starter dbt model" - columns: - - name: id - description: "The primary key for this table" - tests: - - unique - - not_null \ No newline at end of file diff --git a/models/staging/erp_banvic/_erp_banvic.yml b/models/staging/erp_banvic/_erp_banvic.yml new file mode 100644 index 0000000..8c63734 --- /dev/null +++ b/models/staging/erp_banvic/_erp_banvic.yml @@ -0,0 +1,68 @@ +version: 2 + +sources: + - name: erp + description: ERP do banco Banvic. + schema: erp_banvic + tables: + - name: agencias + description: Tabela que contém informações sobre as agências, como nome, endereço, cidade, estado, tipo de agência e data de abertura. + columns: + - name: cod_agencia + data_tests: + - unique + - not_null + + - name: clientes + description: Tabela que armazena dados dos clientes, incluindo nome, e-mail, tipo de cliente, CPF/CNPJ, data de nascimento e endereço. + columns: + - name: cod_cliente + data_tests: + - unique + - not_null + + - name: colaboradores + description: Tabela que contém dados dos colaboradores, como nome, e-mail, CPF, data de nascimento e endereço. + columns: + - name: cod_colaborador + data_tests: + - unique + - not_null + + - name: colaborador_agencia + description: Tabela de relacionamento entre colaboradores e agências, indicando quais colaboradores estão associados a quais agências. + columns: + - name: cod_colaborador + - name: cod_agencia + + - name: contas + description: Tabela que registra as informações das contas bancárias dos clientes, incluindo número da conta, agência, saldo, tipo de conta e data de abertura. + columns: + - name: num_conta + data_tests: + - unique + - not_null + + - name: propostas_credito + description: Tabela que armazena as propostas de crédito feitas aos clientes, incluindo dados como taxa de juros, valor da proposta, valor financiado, parcelas e status. + columns: + - name: cod_proposta + data_tests: + - unique + - not_null + + - name: transacoes + description: Tabela que registra as transações realizadas nas contas dos clientes, incluindo tipo da transação, valor e data da transação. + columns: + - name: cod_transacao + data_tests: + - unique + - not_null + + - name: localidades + description: Tabela que registra as informações de cidade e estado. + columns: + - name: cod_localidade + data_tests: + - unique + - not_null \ No newline at end of file diff --git a/models/staging/erp_banvic/schema/stg_erp__agencias.yml b/models/staging/erp_banvic/schema/stg_erp__agencias.yml new file mode 100644 index 0000000..ed6f74b --- /dev/null +++ b/models/staging/erp_banvic/schema/stg_erp__agencias.yml @@ -0,0 +1,9 @@ +models: + - name: stg_erp__agencias + description: Modelo de staging de agências. + columns: + - name: pk_agencia + description: Chave primária da agência. + data_tests: + - unique + - not_null \ No newline at end of file diff --git a/models/staging/erp_banvic/schema/stg_erp__clientes.yml b/models/staging/erp_banvic/schema/stg_erp__clientes.yml new file mode 100644 index 0000000..360042b --- /dev/null +++ b/models/staging/erp_banvic/schema/stg_erp__clientes.yml @@ -0,0 +1,9 @@ +models: + - name: stg_erp__clientes + description: Modelo de staging de clientes. + columns: + - name: pk_cliente + description: Chave primária do cliente. + data_tests: + - unique + - not_null \ No newline at end of file diff --git a/models/staging/erp_banvic/schema/stg_erp__colaboradores.yml b/models/staging/erp_banvic/schema/stg_erp__colaboradores.yml new file mode 100644 index 0000000..4b92b18 --- /dev/null +++ b/models/staging/erp_banvic/schema/stg_erp__colaboradores.yml @@ -0,0 +1,9 @@ +models: + - name: stg_erp__colaboradores + description: Modelo de staging de colaboradores. + columns: + - name: pk_colaborador + description: Chave primária do colaborador. + data_tests: + - unique + - not_null \ No newline at end of file diff --git a/models/staging/erp_banvic/schema/stg_erp__localidades.yml b/models/staging/erp_banvic/schema/stg_erp__localidades.yml new file mode 100644 index 0000000..441878e --- /dev/null +++ b/models/staging/erp_banvic/schema/stg_erp__localidades.yml @@ -0,0 +1,9 @@ +models: + - name: stg_erp__localidades + description: Modelo de staging de localidades. + columns: + - name: pk_localidade + description: Chave primária da localidade. + data_tests: + - unique + - not_null \ No newline at end of file diff --git a/models/staging/erp_banvic/schema/stg_erp__transacoes.yml b/models/staging/erp_banvic/schema/stg_erp__transacoes.yml new file mode 100644 index 0000000..e5ce29f --- /dev/null +++ b/models/staging/erp_banvic/schema/stg_erp__transacoes.yml @@ -0,0 +1,9 @@ +models: + - name: stg_erp__transacoes + description: Modelo de staging de transações. + columns: + - name: pk_transacao + description: Chave primária da transação. + data_tests: + - unique + - not_null diff --git a/models/staging/erp_banvic/stg_erp__agencias.sql b/models/staging/erp_banvic/stg_erp__agencias.sql new file mode 100644 index 0000000..a8c9781 --- /dev/null +++ b/models/staging/erp_banvic/stg_erp__agencias.sql @@ -0,0 +1,17 @@ +with +fonte_agencias as ( + select * + from {{ source('erp', 'agencias') }} +), + +renomeado as ( + select + cast(cod_agencia as int) as pk_agencia + , nome as nome_agencia + , tipo_agencia as tipo_agencia + , cast(cod_localidade as int) as fk_localidade + from fonte_agencias +) + +select * +from renomeado \ No newline at end of file diff --git a/models/staging/erp_banvic/stg_erp__clientes.sql b/models/staging/erp_banvic/stg_erp__clientes.sql new file mode 100644 index 0000000..4289610 --- /dev/null +++ b/models/staging/erp_banvic/stg_erp__clientes.sql @@ -0,0 +1,23 @@ +with +fonte_clientes as ( + select * + from {{ source('erp', 'clientes') }} +), + +renomeado as ( + select + cast(cod_cliente as int) as pk_cliente + , cast(cod_localidade as int) as fk_localidade + , primeiro_nome || ' ' || ultimo_nome as nome_cliente + , email as email_cliente + , tipo_cliente + , cast(data_inclusao as timestamp) as ts_inclusao + , regexp_replace(cpfcnpj, '[^a-zA-Z0-9]', '') as cpfcnpj_cliente + , cast(data_nascimento as date) as data_nascimento_cliente + , endereco as endereco_cliente + , regexp_replace(cep, '[^a-zA-Z0-9]', '') as cep_cliente + from fonte_clientes +) + +select * +from renomeado \ No newline at end of file diff --git a/models/staging/erp_banvic/stg_erp__colaboradores.sql b/models/staging/erp_banvic/stg_erp__colaboradores.sql new file mode 100644 index 0000000..8ce09e7 --- /dev/null +++ b/models/staging/erp_banvic/stg_erp__colaboradores.sql @@ -0,0 +1,17 @@ +with +fonte_colaboradores as ( + select * + from {{ source('erp', 'colaboradores') }} +), + +renomeado as ( + select + cast(cod_colaborador as int) as pk_colaborador + , primeiro_nome || ' ' || ultimo_nome as nome_colaborador + , email as email_colaborador + , cast(cod_gerente as int) as fk_gerente + from fonte_colaboradores +) + +select * +from renomeado \ No newline at end of file diff --git a/models/staging/erp_banvic/stg_erp__contas.sql b/models/staging/erp_banvic/stg_erp__contas.sql new file mode 100644 index 0000000..962efaa --- /dev/null +++ b/models/staging/erp_banvic/stg_erp__contas.sql @@ -0,0 +1,23 @@ +with +fonte_contas as ( + select * + from {{ source('erp', 'contas') }} +), + +renomeado as ( + select + cast(num_conta as int) as pk_conta + , cod_cliente as fk_cliente + , cod_agencia as fk_agencia + , cod_colaborador as fk_colaborador + , cast(num_conta as int) as numero_conta + , tipo_conta + , cast(data_abertura as timestamp) as ts_abertura_conta + , cast(saldo_total as numeric(32,2)) as saldo_total + , cast(saldo_disponivel as numeric(32,2)) as saldo_disponivel + , cast(data_ultimo_lancamento as timestamp) as ts_ultimo_lancamento + from fonte_contas +) + +select * +from renomeado \ No newline at end of file diff --git a/models/staging/erp_banvic/stg_erp__localidades.sql b/models/staging/erp_banvic/stg_erp__localidades.sql new file mode 100644 index 0000000..ce6eb8e --- /dev/null +++ b/models/staging/erp_banvic/stg_erp__localidades.sql @@ -0,0 +1,16 @@ +with +fonte_localidades as ( + select * + from {{ source('erp', 'localidades') }} +), + +renomeado as ( + select + cod_localidade as pk_localidade + , cast(cidade as string) as cidade + , cast(uf as string) as uf + from fonte_localidades +) + +select * +from renomeado \ No newline at end of file diff --git a/models/staging/erp_banvic/stg_erp__transacoes.sql b/models/staging/erp_banvic/stg_erp__transacoes.sql new file mode 100644 index 0000000..daad9f3 --- /dev/null +++ b/models/staging/erp_banvic/stg_erp__transacoes.sql @@ -0,0 +1,18 @@ +with +fonte_transacoes as ( + select * + from {{ source('erp', 'transacoes') }} +), + +renomeado as ( + select + cast(cod_transacao as int) as pk_transacao + , cast(num_conta as int) as fk_conta + , cast(data_transacao as timestamp) as ts_transacao + , nome_transacao + , cast(valor_transacao as numeric(32,2)) as valor_transacao + from fonte_transacoes +) + +select * +from renomeado diff --git a/package-lock.yml b/package-lock.yml new file mode 100644 index 0000000..36f99ad --- /dev/null +++ b/package-lock.yml @@ -0,0 +1,5 @@ +packages: + - name: dbt_utils + package: dbt-labs/dbt_utils + version: 1.3.1 +sha1_hash: 1b75844a5c14558fe9ae17335b3632c080d6784c diff --git a/packages.yml b/packages.yml new file mode 100644 index 0000000..f24c7dd --- /dev/null +++ b/packages.yml @@ -0,0 +1,3 @@ +packages: + - package: dbt-labs/dbt_utils + version: 1.3.1 \ No newline at end of file