上下文
我想在选定的日期范围内执行累积计算。 (即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
答案 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;的联接,所以对于您将加入所有之前的行。