26/11/2024
Neste post, vamos abordar um problema desafiador que testa habilidades avançadas em SQL para navegar por hierarquias corporativas e consolidar informações de múltiplas tabelas. Este tipo de problema é ideal para quem deseja melhorar suas habilidades em junções, agrupamento e contagem de dados.
Amber, fundadora de um conglomerado, adquiriu novas empresas, cada uma com uma estrutura hierárquica específica:
Fundador
Gerente Principal (Lead Manager)
Gerente Sênior (Senior Manager)
Gerente (Manager)
Funcionário (Employee)
Nosso objetivo é escrever uma consulta SQL que exiba:
O código da empresa (company_code
)
O nome do fundador
O total de gerentes principais
O total de gerentes seniores
O total de gerentes
O total de funcionários
A saída deve ser ordenada em ordem crescente do código da empresa.
O código da empresa (‘company_code’) deve ser tratado como string, portanto, a ordenação deve ser alfanumérica.
As tabelas podem conter registros duplicados.
Coluna | Tipo |
---|---|
company_code | String |
founder | String |
Coluna | Tipo |
lead_manager_code | String |
company_code | String |
Coluna | Tipo |
senior_manager_code | String |
lead_manager_code | String |
company_code | String |
Coluna | Tipo |
manager_code | String |
senior_manager_code | String |
lead_manager_code | String |
company_code | String |
Coluna | Tipo |
employee_code | String |
manager_code | String |
senior_manager_code | String |
lead_manager_code | String |
company_code | String |
A consulta SQL que resolve o problema é a seguinte:
A hierarquia é construída conectando as tabelas de forma sequencial:
Company se conecta com Lead_Manager via company_code
.
Lead_Manager se conecta com Senior_Manager via lead_manager_code
.
Senior_Manager se conecta com Manager via senior_manager_code
.
Manager se conecta com Employee via manager_code
.
Utilizamos LEFT JOIN
para incluir todas as empresas, mesmo aquelas que não possuem todos os níveis hierárquicos preenchidos. Isso garante que o resultado exiba valores zerados para os níveis ausentes.
Usamos COUNT(DISTINCT ...)
para garantir que cada entidade seja contada apenas uma vez dentro de sua categoria. Por exemplo:
COUNT(DISTINCT lm.lead_manager_code)
conta os gerentes principais únicos.
COUNT(DISTINCT e.employee_code)
conta os funcionários únicos.
O GROUP BY c.company_code, c.founder
agrupa os resultados por empresa e fundador, permitindo calcular as contagens para cada empresa separadamente.
O ORDER BY c.company_code
organiza os resultados em ordem alfanumérica de códigos das empresas, conforme solicitado.
company_code | founder | total_lead_managers | total_senior_managers | total_managers | total_employees |
C1 | Monika | 1 | 2 | 1 | 2 |
C2 | Samantha | 1 | 1 | 2 | 2 |
Este desafio destaca a importância de entender estruturas hierárquicas e manipular dados relacionais complexos em SQL. Ao resolver este problema, praticamos:
Construção de consultas com múltiplas junções.
Uso de funções de agregação.
Tratamento de dados ausentes com LEFT JOIN
.
Ordenação e agrupamento de dados.
Gostou deste desafio? Deixe seu comentário ou compartilhe como você o resolveria!