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。
对于每个现有条目,在new_col
我需要存储到new_col
5个之前的日历日期,直至date
列中的日期。例如。对于上表中的第一行,我需要5/16,5/15,5/14,5/13,5/12
中的new_col
。
表格中有很多产品,每种产品都有很多日期。
我尝试根据这两列对表进行分区,但无法找到在new_col
中输入5天的方法。
请提供任何建议。
答案 0 :(得分: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 强> 的
答案 1 :(得分: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