Eu tenho uma tabela com uma coluna para ID
, Date
e Frequency
de ocorrência para esse particular date
e ID
.
ID date Frequency
1 2014-05-18 5
1 2014-05-19 4
1 2014-05-20 25
2 2014-05-20 7
3 2014-05-18 4
3 2014-05-20 1
4 2014-05-18 6
Estou procurando inserir as datas para cada um ID
que não está lá no momento (supondo que a data varie de 2014-05-18
até 2014-05-20
) e adicionar um valor de 0 Frequency
para eles.
Por exemplo, você pode ver que
ID
1 tem uma observação para as três datas;
ID
2 está faltando 2014-05-18
e 2014-05-19
;
ID
3 está faltando 2014-05-19
;
ID
4 está faltando 2014-05-19
e 2014-05-20
.
Portanto, a saída deve ficar assim
ID date Frequency
1 2014-05-18 5
1 2014-05-19 4
1 2014-05-20 25
2 2014-05-18 0
2 2014-05-19 0
2 2014-05-20 7
3 2014-05-18 4
3 2014-05-19 0
3 2014-05-20 1
4 2014-05-18 6
4 2014-05-19 0
4 2014-05-20 0
Eu tentei o seguinte a partir desta pergunta . No entanto, isso só adicionará datas com 0 Frequency
que não estão presentes em toda a tabela, em vez de em um ID
nível.
DECLARE @s DATE = '20140518', @e DATE = '20140520'; SELECT c.date, Frequency = COALESCE(a.Frequency,0) FROM dbo.Calendar AS c LEFT OUTER JOIN dbo.table AS a ON c.date = s.[date] WHERE c.d >= @s AND c.d < DATEADD(DAY, 1, @e);
Usando sua consulta de exemplo base acima, esse código deve fazer o que você está procurando. As mudanças importantes:
O código:
Assumindo esta tabela/dados:
Você precisa gerar a lista de datas no intervalo e, em seguida, produzir uma linha para cada data combinada com cada ID exclusivo que existe em seu intervalo e, em seguida, deixar a saída externa para seus dados reais.
Uma alternativa potencialmente um pouco mais eficiente:
Resultado:
Um problema com uma CTE recursiva é que, se você precisar dar suporte a um intervalo de datas > 100 dias, precisará adicionar
OPTION (MAXRECURSION n)
.