【问题标题】:How to get data for last 4 weeks per individual product/entry date如何获取每个产品/进入日期最近 4 周的数据
【发布时间】:2011-03-02 14:12:41
【问题描述】:

我有一个问题,我有 4 天作为输入,我必须获取他们过去 4 周的值

最近 4 周并不意味着我有解决方案的最近 4 周。

    SELECT prodno, 
           ardate8n, 
           selloff1 
    FROM   sales s 
           JOIN ( SELECT CAST(DATE_SUB('2011-02-27', INTERVAL 1 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-27' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-27', INTERVAL 2 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-27' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-27', INTERVAL 3 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-27' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-27', INTERVAL 4 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-27' AS adt

UNION ALL

 SELECT CAST(DATE_SUB('2011-02-26', INTERVAL 1 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-26' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-26', INTERVAL 2 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-26' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-26', INTERVAL 3 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-26' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-26', INTERVAL 4 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-26' AS adt

UNION ALL

 SELECT CAST(DATE_SUB('2011-02-25', INTERVAL 1 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-25' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-25', INTERVAL 2 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-25' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-25', INTERVAL 3 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-25' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-25', INTERVAL 4 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-25' AS adt

UNION ALL

 SELECT CAST(DATE_SUB('2011-02-24', INTERVAL 1 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-24' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-24', INTERVAL 2 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-24' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-24', INTERVAL 3 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-24' AS adt
 UNION ALL
 SELECT CAST(DATE_SUB('2011-02-24', INTERVAL 4 WEEK) AS DECIMAL(8,0)) AS wdt, '2011-02-24' AS adt) days 
             ON s.ardate8n = days.wdt 
    WHERE  custno = 38726 
           AND deptno = 0 
           AND Find_in_set(prodno, '0020,0064,0070,0073,0096') > 0 
    ORDER by prodno,adt,ardate8n;

如您所见,我有最近 4 周的硬编码。这只会读取每个产品/每个条目日期最近的 4 周,如果缺少一个或多个周的记录,我不会得到 4 行。

所以我需要动态地获取它,并对此进行某种限制。 sales.ardate8n 给出是否有给定日期的记录。

这会返回以下数据

0006, '2011-03-03', 20110127, 0
0006, '2011-03-03', 20110203, 0
0006, '2011-03-03', 20110210, 0
0006, '2011-03-04', 20110128, 0
0006, '2011-03-04', 20110204, 0
0006, '2011-03-05', 20110129, 0
0006, '2011-03-05', 20110205, 0
0006, '2011-03-05', 20110212, 0
0006, '2011-03-05', 20110219, 0

正如您在输入日期2011-03-03 看到的那样,同一工作日的产品只有 3 行。 对于输入日期2011-03-04,同一工作日的产品只有 2 行。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    虽然逗号分隔的列表是一种将一组值传递给查询的便捷方式,但它不适合这种情况,即要求请求的每个值都应存在于数据集中。因此,不应将这些值用作列表,而应将这些值设置为数据列,行集。这样就可以将所有这些都包含在结果集中。

    以上内容适用于查询中的prodno 值列表,但日期也是如此。

    这是一个示例,说明如果将输入数据制成数据集,如何满足要求:

    SELECT
      p.prodno,
      d.date,
      CAST(DATESUB(d.date, INTERVAL (w.weeksAgo) WEEK) AS DECIMAL(8, 0)) AS ardate8n,
      s.selloff1
    
    FROM       (SELECT @date1 AS date
      UNION ALL SELECT @date2
      UNION ALL SELECT @date3
      UNION ALL SELECT @date4) d
    
    CROSS JOIN (SELECT 1 AS weeksAgo
      UNION ALL SELECT 2
      UNION ALL SELECT 3
      UNION ALL SELECT 4) w
    
    CROSS JOIN (SELECT '0020' AS prodno
      UNION ALL SELECT '0064'
      UNION ALL SELECT '0070'
      UNION ALL SELECT '0073'
      UNION ALL SELECT '0096') p
    
    LEFT JOIN sales s
      ON s.ardate8n = CAST(DATESUB(d.date, INTERVAL (w.weeksAgo) WEEK) AS DECIMAL(8, 0))
     AND s.prodno   = p.prodno
     AND s.custno   = 38726 
     AND s.deptno   = 0
    

    【讨论】:

      【解决方案2】:

      我将添加一个简单的表格,其中包含从开始年份到结束年份的所有可用日期 - 您在销售表中的日期范围。

      然后我会按日期加入表格。

      在我将给定日期作为上限的地方。

      我会按日期订购。

      然后简单地说:

      select top 4
      

      join 和 select 当然是 foreach 给定的日期。

      这样会更快更高效...

      【讨论】:

        猜你喜欢
        • 2022-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 2021-07-27
        • 2021-11-04
        相关资源
        最近更新 更多