Espérons que c'est un peu plus facile à lire que celui de Martin. J'ai utilisé différents tableaux et exemples de données, extrapolant, espérons l'info droite:
CREATE TABLE [dbo].[Quantity](
[PeriodStart] [date] NOT NULL,
[PeriodEnd] [date] NOT NULL,
[Quantity] [int] NOT NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[SoldItems](
[PeriodStart] [date] NOT NULL,
[PeriodEnd] [date] NOT NULL,
[SoldItems] [int] NOT NULL
) ON [PRIMARY]
INSERT INTO Quantity (PeriodStart,PeriodEnd,Quantity)
SELECT '20100101','20100115',5
INSERT INTO SoldItems (PeriodStart,PeriodEnd,SoldItems)
SELECT '20100105','20100107',2 union all
SELECT '20100106','20100108',1
La requête réelle est maintenant:
;WITH Dates as (
select PeriodStart as DateVal from SoldItems union select PeriodEnd from SoldItems union select PeriodStart from Quantity union select PeriodEnd from Quantity
), Periods as (
select d1.DateVal as StartDate, d2.DateVal as EndDate
from Dates d1 inner join Dates d2 on d1.DateVal < d2.DateVal left join Dates d3 on d1.DateVal < d3.DateVal and d3.DateVal < d2.DateVal where d3.DateVal is null
), QuantitiesSold as (
select StartDate,EndDate,COALESCE(SUM(si.SoldItems),0) as Quantity
from Periods p left join SoldItems si on p.StartDate < si.PeriodEnd and si.PeriodStart < p.EndDate
group by StartDate,EndDate
)
select StartDate,EndDate,q.Quantity - qs.Quantity
from QuantitiesSold qs inner join Quantity q on qs.StartDate < q.PeriodEnd and q.PeriodStart < qs.EndDate
Et le résultat est:
StartDate EndDate (No column name)
2010-01-01 2010-01-05 5
2010-01-05 2010-01-06 3
2010-01-06 2010-01-07 2
2010-01-07 2010-01-08 4
2010-01-08 2010-01-15 5
Explication: Je m en utilisant trois expressions de table communes. Le premier (Dates) rassemble toutes les dates dont nous parlons, à partir des deux tables impliquées. La seconde (Périodes) sélectionne des valeurs consécutives à partir des dates CTE. Et le troisième (QuantitiesSold) trouve ensuite les éléments de la table SoldItems qui chevauchent ces périodes, et ajoute leurs totaux ensemble. Tout ce qui reste dans la partie extérieure sélectionner est de soustraire ces quantités de la quantité totale stockée dans la quantité Tableau
Voir cet article MSDN pour l'utilisation détaillée des boucles While dans T-SQL http://msdn.microsoft.com/en-us/library/ms178642.aspx (en supposant que vous utilisez SQL Server!) – jules