根据时间跨度

时间:2015-07-02 21:16:05

标签: mysql sql

我无法编写需要以下内容的查询:

我有4个游戏产品表:

表1(足球)

PRODUCT_NAME

SoccerBall

SoccerShoes

SoccerShins

表2(板球)

PRODUCT_NAME

CricketBall

CricketStumps

CricketBat

表3(橄榄球)

PRODUCT_NAME

篮球

表4(乒乓)

PRODUCT_NAME

Pingpongball

我还有一个表格可以产生所有产品的收入,如下所示:

表5

Userid OrderSno Product_Name OrderTime Revenue

123 66243 CricketBall 12Jan2012 35

123 66553 CricketBat 15June2013 60

123 36476 SoccerBall 15Dec2013 15

结果表应该是这样的:

Ordertime(排序)板球(3个月)板球(6个月)板球(终身)

12Jan2012 0 0 0

15June2013 0 0 35

2013年12月15日0 60 95(60 + 35)

足球(3个月)足球(6个月)足球(终身)

      0                     0                 0

      0                     0                 0

      0                     0                 0

上表列出了在购买特定产品之前购买的每件产品所产生的收入。这基于orderdate / time sorted。 例如:用户123发出的第一个订单是在2012年1月12日。因此,用户之前没有购买任何东西,因为这是他的第一个订单。因此,结果表的第一行应为0。 来到第二排,他做的第二次购买是在2013年6月15日。因此,结果表应包含第二个订单之前相应产品类型的所有收入。因此,在这种情况下,35将在Cricket字段下面(因为Product_name属于Cricket表)并且它将落入Lifetime字段。这是因为订单购买日期是2013年6月15日。所以3个月前没有购买任何东西。同样在此日期前6个月没有购买任何东西。但是在购买Cricket Ball之前1年或更长时间内产生了35的收入。因此35的值应该根据板球的Product_Name落入Cricket的Lifetime领域。

所有产品都应该发生同样的事情。我知道查询很复杂,我不确定这是否可行。由于我对此有任何帮助,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

嗯,我不确定这究竟是你想要的,但我认为它的工作看一看。如果你想要一张桌子上的所有运动,联盟就会这样做。

Select Product_Name
        ,YEAR(ordertime)
        ,SUM(case when MONTH(ordertime) in (1,2,3) then revenue else 0 end) 'Q1'
        ,SUM(case when MONTH(ordertime) between 1 and 6 then revenue else 0 end) 'Q2'
        ,SUM(case when MONTH(ordertime) between 1 and 9 then revenue else 0 end) 'Q3'
        ,SUM(revenue) 'Q4'
from PingPong
group by Product_Name, YEAR(ordertime)