mysql - Mysql查询:如何计算每个类别两个时期之间的统计增长率
问题描述
从此日期和类别输入表中:
我想得到这些下表,显示每个第一和第二季度每个类别的行数,以及第二和第一季度之间行数的增长,值和百分比 - 这是一个简单的统计表类型可以满足以获得每个时间段的项目数量及其增长。
获取此表的 sql 查询是什么?
这是创建 sql 表的 SQL 代码,以便您重现架构:
CREATE TABLE `table_a_test_table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`date_row` timestamp NULL DEFAULT NULL,
`category` varchar(255) NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
这是用数据填充表的sql代码:
INSERT INTO `table_a_test_table` (`date_row`, `category`)
VALUES
('2020-01-03 00:00:00', 'A'),
('2020-02-02 00:00:00', 'A'),
('2020-03-08 00:00:00', 'B'),
('2020-02-06 00:00:00', 'C'),
('2020-04-07 00:00:00', 'B'),
('2020-05-21 00:00:00', 'A'),
('2020-06-07 00:00:00', 'C'),
('2020-06-08 00:00:00', 'B')
;
我已经尝试了以下 sql 代码来获取结果表,但我不知道我应该在哪里,以及我应该如何引入该category
字段以便按输出获取组。
SELECT
nb_rows_q1.nb_of_rows AS `number of row in q1`,
nb_rows_q2.nb_of_rows AS `number of row in q2`,
((nb_rows_q2.nb_of_rows - nb_rows_q1.nb_of_rows)/nb_rows_q1.nb_of_rows)*100 AS `growth nb of rows between q2 vs q1`
FROM
(
SELECT COUNT(id) AS nb_of_rows
FROM table_a_test_table
WHERE
date_row >= '2020-01-01 00:00:00'
AND date_row < '2020-04-01 00:00:00'
) AS nb_rows_q1,
(
SELECT COUNT(id) AS nb_of_rows
FROM table_a_test_table
WHERE
date_row >= '2020-04-01 00:00:00'
AND date_row < '2020-07-01 00:00:00'
) AS nb_rows_q2
;
上面的代码,返回以下内容:
所以现在,我想将该category
字段放入代码中。但我不知道该怎么做。
任何想法 ?
解决方案
您可能只需要一个子查询而根本不需要JOIN
。像这样的东西:
SELECT category,
q1 AS `number of row in q1`,
q2 AS `number of row in q2`,
q2-q1 AS `variation of nb of q2 vs q1`,
((q2-q1)/q1)*100 AS `growth nb of rows between q2 vs q1`
FROM
(SELECT category,
SUM(CASE WHEN date_row >= '2020-01-01 00:00:00'
AND date_row < '2020-04-01 00:00:00'
THEN 1 ELSE 0 END) AS 'q1',
SUM(CASE WHEN date_row >= '2020-04-01 00:00:00'
AND date_row < '2020-07-01 00:00:00'
THEN 1 ELSE 0 END) AS 'q2'
FROM table_a_test_table
GROUP BY category) A;
我使用表达式的基本SUM()
查询CASE
。您之前的两个子查询中的条件我用作CASE
表达式中的条件,后跟一个GROUP BY
oncategory
列。正如您所看到的,我为 and 分配了简短的缩写,q1
而q2
不是在同一行中对差异和百分比进行所有计算SELECT
,而是将查询变成了子查询并在外部进行计算。在我看来,这使查询更具可读性。
推荐阅读
- java - Drools 6.5.0.Final 中 StatefulKnowledgeSession 中的内存泄漏
- php - php 7.1 preg_replace 上的 php code deprecated 错误
- javascript - 如何从UTC更改日期格式
- docker - docker-compose 需要通过服务名称获取属性,尤其是端口
- typescript - 基于泛型的类型(函数参数的类型)
- gradle - Gradle api 配置未按预期工作
- java - 如何在不同步充满对象的 ArrayList 的情况下锁定?
- android - CardView 高程和边框在动画 CardView 后被移除
- javascript - 如何在我的 JS 中的 eventListener 之前加载我的生成 dom 函数
- redirect - 用于 301 和 302 响应的 API 网关缓存