2017-10-18 3 views
2

Ich habe eine Abfrage, die in der Tabelle ergibt sich wie folgt dar:TSQL - Hinzufügen Daten fehlt

select * from (select [iKey], [StartDate], [FirstFCDate] from (SELECT [iKey], min([Date]) as [FirstFCDate] from dbo.factFC group by [iKey]) as gp left outer join (select [StartDate], [Key] from dbo.iKeys) dw on gp.iKey = dw.[Key]) ft 

Table1 
iKey StartDate  FirstFCDate 
101  2017-01-13  2017-04-01 
52  2016-11-11  2017-04-01 
21  2017-02-23  2017-04-01 
19  2014-01-21  2017-05-01 
34  2016-08-18  2017-07-01 

Was ich versuche zu tun, um eine Zeile in meine Faktentabelle ein (eine separate Tabelle namens dbo.factProd) so dass auf dieser Tabelle eine Zeile für jedes Datum zwischen dem Startdatum und dem FirstFCDate steht.

Derzeit sieht meine Faktentabelle wie folgt aus:

factProd 
ID  iKey Date   pAmount fcKey 
1  101  2017-04-01  123  1 
2  101  2017-04-01  456  2 
3  101  2017-04-02  789  1 
4  101  2017-04-02  103  2 
5  101  2017-04-03  192  1 
6  101  2017-04-03  112  2 

Wie Sie, für iKey 101, der erste Tag, an dem factProd Tabelle sehen kann, ist 2017.04.01 (die an der Säule FirstFCDate entspricht richtig in Tabelle1).

Was ich tun möchte, ist eine Zeile zu dieser factProd Tabelle für jedes Datum zwischen 2017-01-13 hinzufügen (aus der StartDate Spalte) für jede iKey + fcKey Kombination.

Also das Endergebnis sollte wie folgt aussehen (ID wird automatisch generiert):

factProd 
ID  iKey  Date   pAmount fcKey 
99  101  2017-01-13  0   1 
100 101  2017-01-13  0   2 
101 101  2017-01-14  0   1 
102 101  2017-01-14  0   2 
103 101  2017-01-15  0   1 
104 101  2017-01-15  0   2 
... ...  ...   ...  ... 
199 101  2017-03-31  0   1 
200 101  2017-03-31  0   2 

1  101  2017-04-01  123  1 
2  101  2017-04-01  456  2 
3  101  2017-04-02  789  1 
4  101  2017-04-02  103  2 
5  101  2017-04-03  192  1 
6  101  2017-04-03  112  2 

Antwort

0

James,

Sie finden es vielleicht hilfreich, einen CTE-Tabelle für alle möglichen Termine mit einer Reihe zu bauen zwischen einem Bereich (dh MIN und MAX stammt aus Ihrer Faktentabelle), und dann LINKEN VERBINDEN, um fehlende Daten zu finden. Sie können auch INSERTING in Ihre Faktentabelle mit LEFT JOIN, IS NULL-Logik in Betracht ziehen, um die fehlenden Tage hinzuzufügen. Ihr Szenario ist ein bisschen komplexer als nur das, aber es kann Sie auf einen guten Weg führen. Hier ist ein Code, dass die Tabelle zu erstellen, praktisch:

DECLARE @FromDate datetime 
DECLARE @ToDate datetime 
SET @FromDate = '1/1/2017' 
SET @ToDate = '1/1/2018'; 
WITH DayTable AS (SELECT CAST(@FromDate AS DATETIME) AS theDate UNION ALL SELECT DATEADD(dd, 1, theDate) FROM DayTable s WHERE DATEADD(dd, 1, theDate) <= CAST(@ToDate AS DATETIME)) 
SELECT * FROM DayTable 
OPTION 
(MAXRECURSION 32767) 

Mit freundlichen Grüßen ...

Verwandte Themen