我有一個包含4列和8000行數據的表,其中datetime
列爲2016-01-05。我想將這8000行數據複製到1月1日至31日的所有日子。在SQL Server中使用不同日期複製數據
意思是,即使數據相同,我也應該有8000 * 31天的數據。
如何在不使用Excel文檔的情況下執行此操作。
我有一個包含4列和8000行數據的表,其中datetime
列爲2016-01-05。我想將這8000行數據複製到1月1日至31日的所有日子。在SQL Server中使用不同日期複製數據
意思是,即使數據相同,我也應該有8000 * 31天的數據。
如何在不使用Excel文檔的情況下執行此操作。
首先,在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
通過創建一個快捷日期序列和交叉連接你的表,它可以更新您的表,但是你需要:
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;
你會用交叉連接來做到這一點。我會使用一個計數表來用於交叉連接。選擇* from YourTable交叉連接TallyTable其中TallyTable.Number <= 31.沒有更多的細節,我可以提供更多的東西。 –
謝謝您,先生,我可以提供更多的細節。我添加了示例數據的屏幕截圖,請看看。我有我的表中的前3列和最後一列DT。 SERV_LOC_NUM是我在2016年6月1日的8000條記錄。因此,現在我需要複製2016-06-02,2016-06-03的前3列數據等,我如何創建增量日期列並複製這些記錄。 – user1960217
我會保持周圍的理貨。它可以做很多事情,並會使你的代碼更快。 http://www.sqlservercentral.com/articles/T-SQL/62867/ –