Eu trabalho no sql server 2012, enfrento um problema que não consigo select statment
obter o Partid do mês passado até o mês atual march (3)
.
com base em last date
existir porpartid
e ao mesmo tempo, se houver algum gaps between dates
, preencha-o com base na última data
então se
Encontrei partid com a última data 2022-01-08, então adicionarei 08-02-2022
e 08-03-2022
como partid6070
e se partid
com data no mês 7
e mês seguinte 10
e sem data part id
no mês 8
e 9 então ele deve exibir isso gaps
de acordo com o mês passado, pois partid 1234 tem lacuna.
ambos os casos devem ser aplicados para todos os dados baseados em partid
.
Createddate
usado abaixo no formato yyyy-mm-dd
.
create table Parts
(
PartId int,
CreatedDate date
)
insert into Parts(PartId,CreatedDate)
values
(1234,'2021-07-03'),
(1234,'2021-10-05'),
(1234,'2021-11-05'),
(5981,'2021-11-15'),
(5981,'2021-12-03'),
(6070,'2021-12-12'),
(6070,'2022-01-08')
eu preciso fazer a select statment
exibição parts
como resultado esperado
green rows
apenas para ficar mais claro que essas peças devem ser adicionadas com peças antigas existentes antes.
Resultado esperado
o que eu tento
postagem atualizada
código abaixo me dá parte do meu resultado esperado
porque me dá intervalos nulos entre as datas restantes para obter datas até o mês atual
então como fazer isso por favor?
;with cte as (
select partid, createddate,
dateadd(month, -1,
coalesce(lead(createddate) over (partition by partid order by createddate),
max(createddate) over ()
)
) as end_month
from Parts
union all
select partid, dateadd(month, 1, createddate), end_month
from cte
where createddate <end_month
)
select *
from cte
order by partid, createddate
Parece que o problema que você está tendo são dados ausentes. Quando não há resultado definido para uma determinada data, não há data para agrupar.
Para contornar isso, você pode criar um CTE de intervalos que abrange seu intervalo de dados e, em seguida, unir-se a seus dados com uma junção LEFT OUTER. Isso fornece todos os intervalos em seu intervalo para a consulta
Primeiro, vamos simular alguns dados para testar:
@mockTable agora contém 300 linhas de dados gerados aleatoriamente, com datas deste ano. Usando isso, podemos agregar o total de faturas por dia, se houver:
O CTE chamado dateRange contém todas as datas desde o início do ano, até amanhã. A junção dele com seus dados (ou os dados da mockTable) agora produz um resultado para todos os dias nesse intervalo, com uma contagem NULL totalInvoiceAmount e 0 totalInvoices quando não havia faturas para essa data.
Você pode aplicar uma técnica semelhante aos seus dados. hth