2016-07-25 12 views
1

enter image description here Ich habe eine Tabelle mit 4 Spalten und 8000 Zeilen Daten mit einer datetime Spalte als 2016-01-05. Ich möchte diese 8000 Datenzeilen auf alle Tage vom 1. bis 31. Januar kopieren.Kopieren von Daten mit unterschiedlichen Datumsangaben in SQL Server

Bedeutung, ich sollte 8000 * 31 Tage Daten haben, obwohl es die gleichen Daten.

Wie mache ich es ohne ein Excel-Dokument zu verwenden.

+0

Sie würden dies mit einer Kreuzverbindung tun. Ich würde eine Tally-Tabelle verwenden, um das Kreuz zu verbinden. Wählen Sie * aus YourTable Cross Join TallyTable wo TallyTable.Number <= 31. Ohne weitere Details gibt es nicht viel mehr ich anbieten kann. –

+0

Vielen Dank Herr, was für mehr Details kann ich bieten.? Ich habe den Screenshot meiner Beispieldaten hinzugefügt, bitte werfen Sie einen Blick darauf. Ich habe die ersten 3 Spalten und die letzte Spalte DT in meiner Tabelle. SERV_LOC_NUM ist meine 8000 Datensätze für das Datum 2016-06-01. So jetzt muss ich die 1. 3 Spaltendaten für 2016-06-02,2016-06-03 kopieren und so weiter, wie ich diese inkrementelle Datumsspalte erstelle und diese Aufzeichnungen kopiere. – user1960217

+0

Ich würde das Tally herumhalten. Es kann so viele Dinge tun und wird Ihren Code viel schneller machen. http://www.sqlservercentral.com/articles/T-SQL/62867/ –

Antwort

1

Zuerst mit Werten für jeden Tag im Januar 2016 eine temporäre Datentabelle erstellen.

CREATE TABLE #TEMPDATE (DateCol DATETIME) 

DECLARE @DAY INT = 1 
DECLARE @DATE DATE = '2016-01-01' 
WHILE @DAY <= 31 
BEGIN 
    INSERT #TEMPDATE 
    VALUES (@DATE) 
    SET @DAY +=1 
    SET @DATE = DATEADD(DD,1,@DATE) 
END 

als Nächstes können Sie SELECT gewünschten Spalten und CROSS JOIN als andere haben auch gesagt. Sollten Sie das kartesische Produkt zwischen den beiden Tabellen (8000 x 31 Zeilen) bekommen.

SELECT c.Column1, c.Column2, c.Column3, t.DateCol 
FROM #TEMPDATE t 
CROSS JOIN YourTableName c 
2

Durch eine schnelle Datum Sequenz erstellen und kreuzen Sie die Tabelle, um es verbinden Sie Ihre Tabelle jedoch aktualisieren Sie müssen:

CREATE TABLE #t (c1 INT, c2 INT, c3 INT, c4 INT); 

INSERT INTO #t 
VALUES (10, 10, 10, 10), 
     (20, 20, 20, 20); 

; 
WITH CTE_Dates AS (
    SELECT TOP 31 
      DATEADD(DAY, ROW_NUMBER() OVER (ORDER BY ao.object_id) - 1, '2016-01-01') AS Date 
    FROM  sys.all_objects AS ao 
) 
SELECT #t.c1, 
     #t.c2, 
     #t.c3, 
     #t.c4, 
     CTE_Dates.Date 
FROM #t 
CROSS JOIN CTE_Dates;