Tenho duas tabelas, uma para recursos e outra para a alocação necessária.
Por exemplo:
Recurso | Contar |
---|---|
UMA | 3 |
B | 2 |
C | 8 |
Requeridos | Contar |
---|---|
X | 4 |
S | 3 |
Z | 5 |
A tabela de recursos informa quantas coisas eu tenho de cada recurso e a tabela necessária informa quantos recursos eu preciso para alocar esse item.
No exemplo acima:
- Para X, precisamos atribuir 3 vezes A e 1 vez B.
- Para Y, precisamos atribuir 1 vez B e 2 vezes C.
- Para Z, precisamos atribuir 5 vezes C.
Teremos alguns itens C de reposição…
Atualmente, tentei adicionar uma coluna calculada para ambas as tabelas (Running total - https://stackoverflow.com/questions/860966/calculate-a-running-total-in-sql-server ):
Recurso | Contar | Execução total |
---|---|---|
UMA | 3 | 3 |
B | 2 | 5 |
C | 8 | 13 |
Requeridos | Contar | Execução total |
---|---|---|
X | 4 | 4 |
S | 3 | 7 |
Z | 5 | 12 |
E ter uma multiplicação cartesiana das tabelas, mas esse é o meu beco sem saída, meu principal problema é como ter uma fórmula que saberá dividir um recurso em várias atribuições ou uma atribuição de vários recursos.
Alguém pode sugerir uma pista?
EDITAR
Link do SqlFiddle: http://sqlfiddle.com/#!18/de1417/3
Esquema:
CREATE TABLE Resources (
ResID int primary key,
ResName varchar(255),
ResCnt int
);
CREATE TABLE Required (
ReqID int primary key,
ReqName varchar(255),
ReqCnt int
);
insert into Resources values(1, 'A', 3);
insert into Resources values(2, 'B', 2);
insert into Resources values(3, 'C', 8);
insert into Required values(101, 'X', 4);
insert into Required values(102, 'Y', 3);
insert into Required values(103, 'Z', 5);
Consultas:
SELECT ResName, ResCnt,
SUM(ResCnt) OVER(ORDER BY ResName
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
AS RunningTotal
FROM Resources;
SELECT ReqName, ReqCnt,
SUM(ReqCnt) OVER(ORDER BY ReqName
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
AS RunningTotal
FROM Required;
Uma forma de abordar este problema é definindo intervalos, cruzando as duas tabelas, mantendo as linhas com intervalos sobrepostos e calculando a sobreposição entre cada intervalo. A consulta abaixo faz isso sem prestar muita atenção ao desempenho:
Eu correspondi à maneira como você calculou os totais em execução na pergunta, mas seria mais comum ordenar pelas colunas de chave primária em vez de pelas colunas de nome.
Aqui está o conjunto de resultados para seus dados de amostra: