如果当天销售额为0,则考虑前一周当天销售的Sql

时间:2014-09-10 22:20:04

标签: sql netezza

我有一个商店销售表,如下图所示,包含两年的数据。 如果特定商店的特定日期的销售额为“0”,我必须在上周的同一天进行销售。(当前第7天) 如果那些销售额也是'0'那么当前销售额为8天 如果那些销售额也是'0'那么当前销售额为9天 如果那些销售额也是“0”,则为current_day-10

的销售额
Sales_table1            
day_id      week_id sales   Store
2/1/2014    201401  34566   1234
2/2/2014    201401  67777   567
2/3/2014    201401  3333    698
2/4/2014    201401  45644   345
2/5/2014    201401  2456    789
**2/6/2014  201401  3456    567**
2/7/2014    201401  5674    780
2/8/2014    201402  3333    1234
2/9/2014    201402  22222   567
2/10/2014   201402  111134  698
2/11/2014   201402  56789   345
2/12/2014   201402  4356    789
**2/13/2014 201402  0       567**
2/14/2014   201402  899     780

请提供我可以使用的查询。

1 个答案:

答案 0 :(得分:0)

由于您没有说明您正在使用哪个数据库,因此我使用SQL Server作为我最熟悉的解决方案。

我的查询逻辑是为每个商店选择销售额大于零的所有行,其中销售信息的日期是表中的最大日期或日期小于或等于MAX (日期)-7天(实际上排除了前7天的任何销售额)。我这样做是因为你说你需要在-7,-8,-9等日进行最近的销售或销售。

然后,从该组行中,查询将选择最近的销售日期。

;WITH Store_Dates AS (
  SELECT store, MAX(day_id) max_date, DATEADD(day, -7, MAX(day_id)) old_date
  FROM Sales_Table1
  GROUP BY store
)
,Sale_Days AS (
  SELECT MAX(day_id) day_id, Sales_Table1.store
  FROM Sales_Table1 INNER JOIN Store_Dates
  ON Sales_Table1.store = Store_Dates.store
  WHERE sales > 0
  AND (day_id = max_date 
     OR day_id <= old_date)
  GROUP BY Sales_Table1.store
)
SELECT Sales_Table1.* 
FROM Sales_Table1 INNER JOIN Sale_Days
ON Sales_Table1.store = Sale_Days.store
AND Sales_Table1.day_id = Sale_Days.day_id

SQL Fiddle

我的查询唯一没做的就是在返回 X 天数后停止。您可以通过限制从Sale_Days查询返回的行数来实现。

相关问题