2013-10-04 38 views
0
date,    product, new_col, 
2013/05/16,   A, 
2013/05/18,   A, 
2013/06/15,   A, 
2013/05/16,   B, 
2013/06/13,   B, 
2013/06/20,   B 

我使用SQL Server 2008的5新條目

對於每一個現有的條目,在new_col我需要存儲到new_col 5以前的日曆日期直至幷包括在date日期柱。例如。對於上表中的第一行,我需要在new_col中使用5/16,5/15,5/14,5/13,5/12

我有很多產品在桌子上,每個產品都有很多日期。

我試圖根據這兩列對錶格進行分區,但無法找出在new_col中輸入5天的方法。

請幫助任何建議來做到這一點。

+0

這是否有SQL做?在應用程序或報告層中可能更容易。 –

+3

擁有一個由逗號分隔的多個值的列並不是一個好主意。 –

+0

你在使用什麼SQL服務器軟件? –

回答

0

我不知道這是否是最好的解決方案,但它是第一個突然入我的腦袋。同樣,人們一直在提及,您不需要存儲這個...您可以直接從您部署的任何報告解決方案調用此函數。懶得去掉最後一個逗號,但這很簡單。也可以隨意根據需要調整日期時間格式。

CREATE TABLE dbo.Sam ([Date] DATE, Product VARCHAR(10), NewCol VARCHAR(1000)) 
INSERT INTO dbo.Sam 
SELECT '2013/05/16','A',NULL 
UNION ALL SELECT '2013/05/18','A',NULL 
UNION ALL SELECT '2013/06/15','A',NULL 
UNION ALL SELECT '2013/05/16','B',NULL 
UNION ALL SELECT '2013/06/13','B',NULL 
UNION ALL SELECT '2013/06/20','B',NULL 

GO 


CREATE FUNCTION dbo.fnGet4PreviousDates(@Date DATE, @Product VARCHAR(10)) 
    RETURNS VARCHAR(1000) 
AS 
BEGIN 

    DECLARE @Out VARCHAR(1000) = '' 


    SELECT @Out = @Out + CONVERT(VARCHAR,[Date],112) + ',' 
    FROM (
     SELECT TOP 5 [Date] 
     FROM dbo.Sam 
     WHERE Product = @Product 
     AND [Date] < @Date 
     ORDER BY [Date] DESC 
    ) t 

    RETURN @Out 

END 
GO 

UPDATE dbo.Sam 
SET NewCol = dbo.fnGet4PreviousDates([Date],Product) 

SELECT * FROM dbo.Sam 
1
WITH cal AS (
    SELECT CAST('20130101' AS DATE) as cal_date 
    UNION ALL 
    SELECT DATEADD(day, 1, cal_date) 
    FROm cal 
    WHERE cal_date < CAST('20131231' AS DATE) 
) 
SELECT 
    [date],[product], 
    new_col = STUFF((SELECT ',' + CONVERT(VARCHAR(10),cal.cal_date,111) 
       FROM cal 
       WHERE cal.cal_date BETWEEN DATEADD(day, -4, tbl.[date]) AND tbl.[date] 
       ORDER BY cal.cal_date DESC  
       FOR XML PATH('')  
      ),1,1,'') 
FROM tbl 
OPTION (maxrecursion 0) 

sql fiddle demo