如何在SQL中的日期范围内执行累积计算? (例如01的计算使用01,02的数据使用01和02,依此类推)

时间:2014-07-25 12:15:59

标签: mysql sql

上下文

我想在选定的日期范围内执行累积计算。 (即2014-07-01(以下简称为01)将仅对01中的数据进行计算.02将使用01和02的数据执行计算.03将使用来自01,02和03的数据。等等。)


明细

我记录了在商店中进行的每次销售以及是否进行了投诉。使用下面的查询生成下表很容易 -

SELECT 
Date, 
COUNT(*) AS Sales, 
SUM(CASE WHEN ComplaintMade = 'True' THEN 1 ELSE 0 END) AS Complaints 
FROM SalesRecords 
WHERE Date BETWEEN '2014-07-01' AND '2014-07-05' 
GROUP BY Date 
ORDER BY Date


--------------------------------------
| Date       |  Sales  | Complaints  |
--------------------------------------
| 2014-07-01 | 100     | 2           |
| 2014-07-02 | 150     | 6           |
| 2014-07-03 | 180     | 9           |
| 2014-07-04 | 140     | 10          |
| 2014-07-05 | 300     | 15          |
--------------------------------------


通过扩展此查询并选择以下内容 -

,可以轻松计算每个投诉的平均销售数量
COUNT(*) 
/ 
CASE WHEN(SUM(CASE WHEN ComplaintMade = 'True' THEN 1 ELSE 0 END)) = 0
              THEN 1
              ELSE (SUM(CASE WHEN ComplaintMade = 'True' THEN 1 ELSE 0 END))
              END) 
AS SalesPerComplaint

(显示每次投诉的销售数量(销售/投诉),或者,如果没有投诉,则显示销售数量(销售额/ 1))

这将显示下表。

----------------------------------------------------------
| Date       |  Sales  | Complaints  | SalesPerComplaint |
---------------------------------------------------------|
| 2014-07-01 | 100     | 2           | 50                |
| 2014-07-02 | 150     | 6           | 25                |
| 2014-07-03 | 180     | 9           | 20                |
| 2014-07-04 | 140     | 10          | 14                |
| 2014-07-05 | 300     | 15          | 20                |
---------------------------------------------------------|

我想要做的是显示累积的SalesPerComplaint。因此,对于2014-07-01,将2014-07-01的销售额除以2014-07-01的投诉数量。但是,对于2014-07-02,将01 02的销售除以01 02的投诉。对于03,使用01,02和03.等等。

因此,表格的前几行看起来像 -

--------------------------------------------------------------------
| Date       |  Sales  | Complaints  | CumulativeSalesPerComplaint |
-------------------------------------------------------------------|
| 2014-07-01 | 100     | 2           | 50                          |
| 2014-07-02 | 150     | 6           | 31.25                       |
-------------------------------------------------------------------|

(2014-07-02的CumulativeSalesPerComplaint现在为31.25,因为它是使用目前为止两个日期的销售额(100 + 150 = 250)除以目前为止两个日期的投诉数量计算得出的(2 + 6 = 8)(250/8 = 31.25))

(如果我可以改进这个问题格式,请告诉我。我想尽可能清楚地说明这一点但是如果我包含太多细节或混乱结构请告诉我,我会很乐意改进谢谢。)

我的sqlfiddle位于sqlfiddle.com /#!2 / 9e2ad / 5

1 个答案:

答案 0 :(得分:2)

这个(SqlFiddle)怎么样?

在此查询中,您将加入与您已获得的数据不同的日期:

SELECT sr.uniqueday Date, qry.Sales, qry.Complaints,
SUM(Sales)/SUM(Complaints) CumulativeSalesPerComplaint  
FROM (SELECT DISTINCT(Date) uniqueday FROM SalesRecords) sr
LEFT JOIN (
SELECT 
Date, 
COUNT(*) AS Sales, 
SUM(CASE WHEN ComplaintMade = 'True' THEN 1 ELSE 0 END) AS Complaints,

((COUNT(*)) / (CASE WHEN (SUM( CASE WHEN  ComplaintMade = 'True' THEN 1 ELSE 0 END )) = 0 
                                THEN 1
                                ELSE (SUM( CASE WHEN  ComplaintMade = 'True' THEN 1 ELSE 0 END ))
                                END)
                            ) AS  SalesPerComplaint 

FROM SalesRecords 
WHERE Date BETWEEN '2014-07-01' AND '2014-07-05' 
GROUP BY Date 
ORDER BY Date DESC
  ) qry ON qry.Date <= sr.uniqueday 
GROUP BY sr.uniqueday

诀窍是加入两个表(一个只包含几天,另一个包含您的数据)和一个条件为&#34; qry.Date&lt; = sr.uniqueday&#34;的联接,所以对于您将加入所有之前的行。