在SQL中将日期之前的收入汇总到该日期

时间:2019-04-18 15:25:46

标签: sql ansi-sql

我有一个表“ S8”,显示几本书的发行日期(这是发行日期的一周中的星期六),已售单元,收入和预计供应周数。这些值是每周(星期六周结束)生成的

BOOKTITLE,BOOKDESCRIPTION,BOOKTYPE,RETAILER,WEEKSOLD,RELEASEDATEWEEK,UNITSSOLD,REVENUE,WEEKSOFSUPPLY
A,AAAAAAA,ORIGINAL,AMAZON,4/6/2019,4/20/2019,2,10,10
A,AAAAAAA,ORIGINAL,AMAZON,4/13/2019,4/20/2019,3,15,9
A,AAAAAAA,ORIGINAL,AMAZON,4/20/2019,4/20/2019,4,20,9
A,AAAAAAA,ORIGINAL,AMAZON,4/27/2019,4/20/2019,1,5,10
A,AAAAAAA,ORIGINAL,AMAZON,5/4/2019,4/20/2019,1,5,8
A,AAAAAAA,ORIGINAL,B&N,4/6/2019,4/20/2019,2,10,7
A,AAAAAAA,ORIGINAL,B&N,4/13/2019,4/20/2019,8,40,5
A,AAAAAAA,ORIGINAL,B&N,4/20/2019,4/20/2019,5,25,6
A,AAAAAAA,ORIGINAL,B&N,4/27/2019,4/20/2019,6,30,6
A,AAAAAAA,ORIGINAL,B&N,5/4/2019,4/20/2019,4,20,10
B,BBBBBBBB,SEQUEL,AMAZON,4/6/2019,4/13/2019,4,20,1
B,BBBBBBBB,SEQUEL,AMAZON,4/13/2019,4/13/2019,5,25,2
B,BBBBBBBB,SEQUEL,AMAZON,4/20/2019,4/13/2019,3,15,4
B,BBBBBBBB,SEQUEL,AMAZON,4/27/2019,4/13/2019,4,20,4
B,BBBBBBBB,SEQUEL,AMAZON,5/4/2019,4/13/2019,8,40,5
B,BBBBBBBB,SEQUEL,B&N,4/6/2019,4/13/2019,2,10,3
B,BBBBBBBB,SEQUEL,B&N,4/13/2019,4/13/2019,6,30,7
B,BBBBBBBB,SEQUEL,B&N,4/20/2019,4/13/2019,4,20,4
B,BBBBBBBB,SEQUEL,B&N,4/27/2019,4/13/2019,4,20,4
B,BBBBBBBB,SEQUEL,B&N,5/4/2019,4/13/2019,3,15,5

出于报告目的,我需要构建一个视图,将所有预售(在发行的第一周之前的几周内购买书籍)汇总到销售的第一周。

为澄清起见,每本书都有一个预售期,您可以在该书实际发行之前购买该书。我需要生成一个视图,将发布日期之前发生的所有这些预售都添加到销售的第一周。因此,如果该书在发行周内售出4件,在预售期间售出10件,则我需要将第1周报告为14件,并从数据集中删除发行周之前的日期。

示例:

BOOKTITLE,BOOKDESCRIPTION,BOOKTYPE,RETAILER,WEEKSOLD,RELEASEDATEWEEK,UNITSSOLD,REVENUE,WEEKSOFSUPPLY
A,AAAAAAA,ORIGINAL,AMAZON,4/20/2019,4/20/2019,9,45,9
A,AAAAAAA,ORIGINAL,AMAZON,4/27/2019,4/20/2019,1,5,10
A,AAAAAAA,ORIGINAL,AMAZON,5/4/2019,4/20/2019,1,5,8
A,AAAAAAA,ORIGINAL,B&N,4/20/2019,4/20/2019,15,75,6
A,AAAAAAA,ORIGINAL,B&N,4/27/2019,4/20/2019,6,30,6
A,AAAAAAA,ORIGINAL,B&N,5/4/2019,4/20/2019,4,20,10
B,BBBBBBBB,SEQUEL,AMAZON,4/13/2019,4/13/2019,9,45,2
B,BBBBBBBB,SEQUEL,AMAZON,4/20/2019,4/13/2019,3,15,4
B,BBBBBBBB,SEQUEL,AMAZON,4/27/2019,4/13/2019,4,20,4
B,BBBBBBBB,SEQUEL,AMAZON,5/4/2019,4/13/2019,8,40,5
B,BBBBBBBB,SEQUEL,B&N,4/13/2019,4/13/2019,8,40,7
B,BBBBBBBB,SEQUEL,B&N,4/20/2019,4/13/2019,4,20,4
B,BBBBBBBB,SEQUEL,B&N,4/27/2019,4/13/2019,4,20,4
B,BBBBBBBB,SEQUEL,B&N,5/4/2019,4/13/2019,3,15,5

我可以使用以下查询生成单位/收入汇总:

SELECT BOOKTITLE,BOOKDESCRIPTION,BOOKTYPE,RETAILER,RELEASEDATEWEEK, SUM(UNITSSOLD), SUM(REVENUE)
  FROM S8
  WHERE WEEKSOLD <= RELEASEDATEWEEK
  GROUP BY BOOKTITLE,BOOKDESCRIPTION,BOOKTYPE,RETAILER,RELEASEDATEWEEK

我不确定如何在适当的地方使用视图用汇总值替换值,也无法弄清楚如何仅保留最近的供应周数(无需汇总它们,我只需要发布日期当周的最新版本)

1 个答案:

答案 0 :(得分:1)

有条件的“如果weeksold日期在releasedateweek日期之前,则使用releasedateweek日期,否则使用weeksold日期呢?在SQL中看起来像CASE WHEN WEEKSOLD < RELEASEDATEWEEK THEN RELEASEDATEWEEK ELSE WEEKSOLD END AS ROLLED_SOLD。然后,假设您在S8的每一行都有发布日期,就可以对它们进行汇总和分组:

SELECT 
  BOOKTITLE, 
  BOOKDESCRIPTION,
  BOOKTYPE,
  RETAILER,
  CASE WHEN WEEKSOLD < RELEASEDATEWEEK THEN RELEASEDATEWEEK ELSE WEEKSOLD END AS ROLLED_SOLD, 
  SUM(UNITSSOLD), 
  SUM(REVENUE)
FROM S8
GROUP BY 
  BOOKTITLE, 
  BOOKDESCRIPTION,
  BOOKTYPE,
  RETAILER,
  CASE WHEN WEEKSOLD < RELEASEDATEWEEK THEN RELEASEDATEWEEK ELSE WEEKSOLD END AS ROLLED_SOLD

希望这些是日期,而不是“看起来像日期的字符串”。如果它们是字符串,那么

  1. 严厉打击自己;)
  2. 将其转换为日期(更改列类型并将其存储为日期(首选)或即时转换(ugh))