2016-07-25 35 views
1

enter image description here我有一個包含4列和8000行數據的表,其中datetime列爲2016-01-05。我想將這8000行數據複製到1月1日至31日的所有日子。在SQL Server中使用不同日期複製數據

意思是,即使數據相同,我也應該有8000 * 31天的數據。

如何在不使用Excel文檔的情況下執行此操作。

+0

你會用交叉連接來做到這一點。我會使用一個計數表來用於交叉連接。選擇* from YourTable交叉連接TallyTable其中TallyTable.Number <= 31.沒有更多的細節,我可以提供更多的東西。 –

+0

謝謝您,先生,我可以提供更多的細節。我添加了示例數據的屏幕截圖,請看看。我有我的表中的前3列和最後一列DT。 SERV_LOC_NUM是我在2016年6月1日的8000條記錄。因此,現在我需要複製2016-06-02,2016-06-03的前3列數據等,我如何創建增量日期列並複製這些記錄。 – user1960217

+0

我會保持周圍的理貨。它可以做很多事情,並會使你的代碼更快。 http://www.sqlservercentral.com/articles/T-SQL/62867/ –

回答

1

首先,在2016年1月創建的每一天值的臨時日期表。

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 

接下來,你可以SELECT所需的列和CROSS JOIN如其他人所說的爲好。應該讓你在兩個表格之間的笛卡爾積(8000 x 31行)。

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

通過創建一個快捷日期序列和交叉連接你的表,它可以更新您的表,但是你需要:

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; 
相關問題