【问题标题】:5 new entries for every existing row每个现有行 5 个新条目
【发布时间】:2013-10-04 13:09:30
【问题描述】:
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 中,我需要将 5 个以前的日历日期存储到 date 列中并包括该日期。例如。对于上表中的第一行,我需要5/16,5/15,5/14,5/13,5/12 中的new_col

我的表格中有很多产品,每个产品都有很多日期。

我尝试根据这两列对表进行分区,但无法找到在new_col 中输入 5 天的方法。

请帮忙提出任何建议。

【问题讨论】:

  • 这必须在 SQL 中完成吗?在应用程序或报告层中可能会容易得多。
  • 一列有多个用逗号分隔的值根本不是一个好主意。
  • 您使用的是什么 SQL 服务器软件?
  • @MostyMostacho For storage 我同意,但我一直在报告中看到这一点。
  • 我在 sql 中创建了一个数据库,这是现有表之一,正在对其运行查询。所以它需要在sql中

标签: sql sql-server sql-server-2008


【解决方案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

【讨论】:

    【解决方案2】:

    我不知道这是否是最好的解决方案,但它是第一个出现在我脑海中的解决方案。同样正如人们所提到的,您不需要存储它......您可以直接从您部署的任何报告解决方案中调用此函数。懒得删除最后一个逗号,但这很简单。您也可以随意调整日期时间格式。

    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
    

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 2017-03-28
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多