MySQL永久运行总计

时间:2018-08-04 15:23:30

标签: mysql running-total

希望您可以帮助我解决此问题。我进行了足够的搜索,但是找不到我要尝试做的任何好的答案。也许不可能,但值得一试,看看我们能做什么。

简介: 我有一个表,用于存储产品标识符(URL),激活日期,取消日期和状态。 从该表中,我导出两个视图以生成每月激活和取消报告(我希望我可以在单个视图/结果中完成此操作,但找不到方法) 最后,要获得摘要输出,我将两个视图留在了激活视图中,并且还执行了一个运行总计列(先前的总计+新激活-取消)。

(SQL:http://sqlfiddle.com/#!9/0e44d5

Table View

到目前为止很好。

问题: 但是,如果我要修改SELECT语句,并在日期末尾添加一个如下所示的日期范围,则仅针对所选对象计算运行总计。此结果对于我运行的查询是正确的。

但是我想要的结果是原始运行总计的延续,因为我想显示所选时间范围内活动服务的总计。

例如,在2017年7月1日,运行总计为500,那么对于所选范围,运行总计应从该值开始。

最简单的方法是将SQL存储为视图。但是由于MySQL无法使用变量创建视图,因此在当前的查询设置中这是不可能的。

众所周知,我的SQL知识不是那么好。所以我不确定从这里做什么。

非常感谢您的帮助。

SQL详细信息:

CREATE TABLE `pbx` (
  `url` varchar(255) NOT NULL,
  `activation_date` date DEFAULT NULL,
  `deactivation_date` date DEFAULT NULL,
  `active_status` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`url`)
);

INSERT INTO `pbx` (`url`, `activation_date`, `deactivation_date`, `active_status`) VALUES
('6970', '0000-00-00', '2014-12-04', 'I'),
('5738', NULL, '2012-10-29', 'I'),
('7782', '2014-00-00', '2014-12-04', 'I'),
('1693', '2014-00-00', '2014-12-04', 'I'),
('5118', '2017-03-14', NULL, 'A'),
('511', '0000-00-00', '2014-07-02', 'I'),
('7204', '2018-03-21', NULL, 'A'),
('4485', '0000-00-00', '2014-07-02', 'I'),
('814', '2017-11-16', NULL, 'A'),
('614', '2017-12-06', NULL, 'A'),
('627', '0000-00-00', '2014-07-03', 'I'),
('1295', '0000-00-00', '2014-07-07', 'I'),
('4591', '2017-08-11', NULL, 'A'),
('9074', '0000-00-00', '2014-12-04', 'I'),
('1594', '2018-07-26', NULL, 'A'),
('747', NULL, '2017-09-15', 'I'),
('8955', '2017-08-30', NULL, 'A'),
('2535', '2017-06-02', NULL, 'A'),
('5811', '2017-06-27', NULL, 'A'),
('1447', NULL, NULL, 'I'),
('9805', '2017-11-03', NULL, 'A'),
('4683', '2015-12-22', '0000-00-00', 'A'),
('3999', '2011-01-18', '2013-11-27', 'I'),
('5947', NULL, '2015-11-03', 'I'),
('7736', '2017-12-07', NULL, 'A'),
('839', '2014-06-16', '0000-00-00', 'A'),
('986', '2017-08-17', NULL, 'A'),
('2416', '2015-07-15', NULL, 'A'),
('9121', '2017-06-27', NULL, 'A'),
('8355', '2017-03-01', NULL, 'A'),
('4415', '2017-09-29', NULL, 'A'),
('7008', '2016-01-28', NULL, 'A'),
('1795', '2017-06-28', NULL, 'A'),
('7951', '2018-01-23', NULL, 'A'),
('4368', '2014-12-18', '2015-01-30', 'I'),
('7991', '2014-02-26', '0000-00-00', 'I'),
('6848', '2016-11-23', NULL, 'A'),
('266', '2015-09-23', NULL, 'A'),
('787', '2018-05-02', NULL, 'A'),
('3139', '2014-09-30', '2015-07-06', 'I'),
('3332', '2018-05-02', NULL, 'A'),
('7244', '2017-11-24', NULL, 'A'),
('6222', '2016-05-31', NULL, 'A'),
('9380', '2015-08-19', '0000-00-00', 'A'),
('8233', '2016-08-01', '2017-03-31', 'I'),
('3025', '2017-03-31', NULL, 'A'),
('425', '2018-06-29', NULL, 'A'),
('3053', '2018-02-08', '2018-07-19', 'I'),
('3988', '2013-03-08', '2013-06-05', 'I'),
('782', '2017-01-05', NULL, 'A'),
('1945', '2018-04-05', NULL, 'A'),
('7379', '2016-09-12', NULL, 'A'),
('1061', '2011-09-01', '2016-08-03', 'I'),
('3168', NULL, NULL, 'P'),
('2658', '2018-07-05', NULL, 'A'),
('3787', '2015-12-28', NULL, 'A'),
('960', '2017-01-09', '2018-01-18', 'I'),
('3438', '2017-09-18', NULL, 'A'),
('4310', NULL, NULL, 'P'),
('1236', '2017-08-15', NULL, 'A'),
('3250', '2015-12-01', NULL, 'A'),
('2544', '2018-04-26', NULL, 'A'),
('2969', '2016-12-06', NULL, 'A'),
('7214', '2017-09-26', NULL, 'A'),
('7161', '2015-01-21', '2015-01-21', 'I'),
('4165', '2012-06-18', NULL, 'A'),
('9339', '2014-03-21', '0000-00-00', 'A'),
('4204', '2017-04-20', NULL, 'A'),
('3000', '2014-04-18', NULL, 'A'),
('2388', '2015-07-01', '2017-08-16', 'I'),
('2940', '2016-02-12', NULL, 'A'),
('7536', '2017-12-20', NULL, 'A'),
('8860', '2018-02-21', NULL, 'A'),
('1694', '2018-03-07', NULL, 'A'),
('1890', '2018-02-28', NULL, 'A'),
('4367', '2015-06-03', '0000-00-00', 'A'),
('6167', '2011-09-21', '0000-00-00', 'A'),
('7732', '2015-05-29', '0000-00-00', 'A'),
('158', '2016-09-01', NULL, 'A'),
('7595', '2011-09-05', NULL, 'A'),
('7501', '2016-11-03', '2018-03-12', 'I'),
('4720', '2017-12-07', NULL, 'A'),
('1096', '2014-03-20', '0000-00-00', 'A'),
('1321', '2017-12-06', NULL, 'A'),
('3316', '2016-04-18', NULL, 'A'),
('2617', '2018-05-10', NULL, 'A'),
('3136', '2013-06-14', NULL, 'A'),
('7831', '2013-06-20', NULL, 'A'),
('9746', '2018-03-09', NULL, 'A'),
('5236', '2016-06-06', NULL, 'A'),
('6942', '2016-03-08', NULL, 'A'),
('9005', '2012-12-21', '2016-02-02', 'I'),
('4195', '2012-11-15', '2012-11-15', 'I'),
('3963', '2015-11-23', '0000-00-00', 'A'),
('7229', '2015-08-05', '0000-00-00', 'A'),
('4255', '2011-03-01', '0000-00-00', 'A'),
('9590', '2017-11-29', NULL, 'A'),
('5183', '2018-07-04', NULL, 'A'),
('7147', '2018-01-29', NULL, 'A');

CREATE VIEW `pbx_activations` AS SELECT CONCAT_WS('',YEAR(activation_date),'-',LPAD(MONTH(activation_date), 2, '0'),'-01') as DATE, COUNT(url) as Activations
FROM pbx 
WHERE MONTH(activation_date) > 0 AND activation_date IS NOT NULL AND active_status <> "P" 
GROUP BY YEAR(activation_date), MONTH(activation_date) ;

CREATE VIEW `pbx_cancellations` AS SELECT CONCAT_WS('',YEAR(deactivation_date),'-',LPAD(MONTH(deactivation_date), 2, '0'),'-01') as DATE, COUNT(url) as Cancellations
FROM pbx 
WHERE MONTH(activation_date) > 0 AND activation_date IS NOT NULL AND MONTH(deactivation_date) > 0 AND deactivation_date IS NOT NULL AND active_status <> "P" 
GROUP BY YEAR(deactivation_date), MONTH(deactivation_date) ;

SELECT act.DATE, Activations, IFNULL(Cancellations,0) as Cancellations, (@runtot :=  Activations - IFNULL(Cancellations,0) + @runtot) AS Total
FROM pbx_activations AS act 
LEFT JOIN pbx_cancellations AS can ON act.date = can.date, (SELECT @runtot:=0) c;

2 个答案:

答案 0 :(得分:0)

请考虑以下内容:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(alpha CHAR(1) NOT NULL PRIMARY KEY);

INSERT INTO my_table VALUES
('a'),('b'),('c'),('d'),('e'),('f'),('g'),('h'),('i');

SELECT alpha, @i:=@i+1 rank FROM my_table,(SELECT @i:=0) vars ORDER BY alpha;
+-------+------+
| alpha | rank |
+-------+------+
| a     |    1 |
| b     |    2 |
| c     |    3 |
| d     |    4 |
| e     |    5 |
| f     |    6 |
| g     |    7 |
| h     |    8 |
| i     |    9 |
+-------+------+

SELECT alpha FROM (SELECT alpha, @i:=@i+1 rank FROM my_table,(SELECT @i:=0) vars ORDER BY alpha) n WHERE rank BETWEEN 4 AND 7;
+-------+
| alpha |
+-------+
| d     |
| e     |
| f     |
| g     |
+-------+

答案 1 :(得分:0)

多亏了Strawberry对子查询的指导,我才能够弄清楚如何从最终查询中获得结果集。

SELECT * 
FROM
(
    SELECT act.DATE, Activations, IFNULL(Cancellations,0) as Cancellations, (@runtot :=  Activations - IFNULL(Cancellations,0) + @runtot) AS Total
    FROM pbx_activations AS act 
    LEFT JOIN pbx_cancellations AS can ON act.date = can.date, (SELECT @runtot:=0) c
) AS tmpTBL
WHERE tmpTBL.date between '2017-07-01' AND DATE(NOW());

现在,无需进行复杂的工作即可获得所需的输出。

之前: Before Results

之后: After Results

感谢大家抽出宝贵时间帮助陌生人。