Não tenho certeza de como formular com precisão essa pergunta.
Essencialmente, digamos que eu tenha vários vendedores em diferentes equipes de vendas. Tipo, a região azul, a região laranja, a região vermelha, tanto faz.
Agora, cada um desses vendedores está conectado a uma região de vendas, mas pode, ocasionalmente, mudar de região de vendas ao longo do tempo.
Digamos que Bob Jones esteve na Região Azul em janeiro de 2015, fevereiro de 2015, março de 2015, mas em abril de 2015, ele foi para a Região Verde.
Então, estou tentando criar um relatório que agregue a receita de vendas com base na região (mesmo que no nível técnico, seja registrado para o vendedor).
Assim teríamos os dados da transação (tabela:Employee_sales) da seguinte forma:
name date sales
Bob Jones February 18th, 2015 $50,000
etc etc.
Portanto, para agregar por região, eu precisaria de uma tabela de dimensão auxiliar da seguinte forma (lembre-se, a região pode mudar com o tempo) (tabela: employee_region)
name region month year
Bob Jones Blue January 2015
Bob Jones Blue February 2015
Bob Jones Blue March 2015
Bob Jones Green April 2015
Então eu posso simplesmente fazer uma consulta:
select er.region, er.month, er.year, sum(es.sales)
from employee_sales es
inner join employee_region er
on es.name = er.name and month(es.date) = er.month and year(es.date) = er.year
group by er.region, er.month, er.year
Isso me daria os dados de que preciso.
NO ENTANTO, agora tenho um problema --- digamos que tenho 500 funcionários e os dados da REGIÃO são atualizados com um mês de atraso. Então, agora, fevereiro de 2016, só temos dados regionais de janeiro de 2016.
Gostaria de fazer, é... para o mês atual (fevereiro de 2016)... se faltar os dados da "tabela auxiliar" para região referente ao mês, pegue o último mês encontrado (que pode ser janeiro, mas às vezes até dezembro ou novembro potencialmente).
Não tenho certeza do que fazer aqui. Criar algum tipo de visualização?
Devo reestruturar a 'tabela auxiliar' para que seja mais uma declaração de desigualdade?
EDIT: Acho que este é um problema de dimensões que muda lentamente. Hmm, provavelmente terei que reorganizar a tabela de dimensões.
Eu não organizaria sua "mesa de ajuda" dessa maneira. Eu manteria apenas {Region, Salesman, StartDate}. Para criar uma exibição de intervalos, una essa tabela a si mesma para criar intervalos de dados
where a.StartDate < b.StartDate
. Use uma junção externa, para que NULL represente um EndDate de "agora", que você pode combinar com a data atual ou outra, conforme apropriado. Para representar partidas (não reatribuições), use uma região artificial chamada CiaoBaby ou algo semelhante.Agora sua tarefa de manutenção é muito mais fácil; você só precisa capturar as alterações de pessoal. A tabela é muito menor (com o tempo, 100 ou 1000 oodles). E você automaticamente tem a suposição embutida de que, na ausência de informações contrárias, um vendedor permanece ligado hoje ao mesmo do mês passado.
Você não precisa criar uma exibição para isso. View é geralmente usado para melhorar o desempenho do código. Para isso, você deve descobrir os valores do mês atual sempre usando a ordem de ano e mês.
Encontre abaixo a solução do seu problema: