首页 > 解决方案 > 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字段放入代码中。但我不知道该怎么做。

任何想法 ?

标签: mysqlsql

解决方案


您可能只需要一个子查询而根本不需要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 BYoncategory列。正如您所看到的,我为 and 分配了简短的缩写,q1q2不是在同一行中对差异和百分比进行所有计算SELECT,而是将查询变成了子查询并在外部进行计算。在我看来,这使查询更具可读性。

演示小提琴


推荐阅读