在MySQL查询中计算百分比并四舍五入结果

在MySQL查询中计算百分比并四舍五入结果

在进行数据分析和统计时,百分比的计算经常会用到。而在MySQL查询语句中,计算列的百分比也是一个常见的需求。本篇文章将介绍在MySQL查询中如何计算百分比,并选择性地四舍五入结果。

阅读更多:MySQL 教程

查找基本数据

为了展示如何计算百分比,首先需要一个包含基本数据的表。我们可以使用以下的SQL语句创建一个名为“sales”的表来模拟销售数据:

CREATE TABLE `sales` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product` varchar(50) NOT NULL,
  `quantity` int(11) NOT NULL,
  `date` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

再使用以下的语句插入一些数据:

INSERT INTO sales (product, quantity, date) VALUES
('Product1', 100, '2020-01-01'),
('Product1', 200, '2020-01-02'),
('Product1', 300, '2020-01-03'),
('Product2', 150, '2020-01-01'),
('Product2', 250, '2020-01-02'),
('Product2', 350, '2020-01-03');

这样,我们就有了一个包含两个产品在三天内的销售量的表格。

基本百分比计算

现在,我们可以在这个表格中,按照每个产品每天的销售量,计算出每天的产品销售占比。这可以使用以下的SQL语句来完成:

SELECT
  product,
  date,
  CONCAT(ROUND((SUM(quantity) / SUM(SUM(quantity)) OVER (PARTITION BY date)) * 100, 2), '%') AS percentage
FROM sales
GROUP BY product, date;

这个查询语句将会得到以下的结果:

+----------+------------+------------+
| product  |    date    | percentage |
+----------+------------+------------+
| Product1 | 2020-01-01 | 40.00%     |
| Product1 | 2020-01-02 | 44.44%     |
| Product1 | 2020-01-03 | 46.15%     |
| Product2 | 2020-01-01 | 60.00%     |
| Product2 | 2020-01-02 | 55.56%     |
| Product2 | 2020-01-03 | 53.85%     |
+----------+------------+------------+

计算百分比的核心语句是:

ROUND((SUM(quantity) / SUM(SUM(quantity)) OVER (PARTITION BY date)) * 100, 2)

这条语句将产品销售数量累加求和,然后除以每一天的销售总量,再乘以100,最后使用ROUND函数四舍五入保留两位小数。这个查询语句的结果中,每一天的产品销售量占比都在0%到100%之间。

显示0%和100%

在某些情况下,我们也会想要显示0%和100%这两种情况。比如在上述的例子中,如果有一天某一种产品没有销售,那么其占比将会为0%。在这种情况下,我们可以使用以下的语句来得到正确的结果:

SELECT
  product,
  date,
  CONCAT(ROUND(IFNULL((SUM(quantity) / SUM(SUM(quantity)) OVER (PARTITION BY date)), 0) * 100, 2), '%') AS percentage
FROM sales
GROUP BY product, date;

这个查询结果与上面的查询结果相比,在当某一种产品当天没有销售的情况下,会显示为0%:

+----------+------------+------------+
| product  |    date    | percentage |
+----------+------------+------------+
| Product1 | 2020-01-01 | 40.00%     |
| Product1 | 2020-01-02 | 44.44%     |
| Product1 | 2020-01-03 | 46.15%     |
| Product2 | 2020-01-01 | 60.00%     |
| Product2 | 2020-01-02 | 55.56%     |
| Product2 | 2020-01-03 | 53.85%     |
| Product3 | 2020-01-01 | 0.00%      |
| Product3 | 2020-01-02 | 0.00%      |
| Product3 | 2020-01-03 | 0.00%      |
+----------+------------+------------+

这条查询语句在计算占比时,使用了IFNULL函数,将某一天某种产品的销售数量如果为空,就将其设为0。这个SQL语句在计算出占比后,也使用了ROUND函数,将结果保留两位小数。

四舍五入

当我们需要按特定的规则来四舍五入百分比时,我们可以使用MySQL中的ROUND函数。ROUND函数可以将任何一个十进制数四舍五入为指定的小数位数,并提供了多种不同的舍入规则。我们可以使用以下的语句进行测试:

SELECT ROUND(1.5), ROUND(-1.5), ROUND(1.23456, 2), ROUND(-1.23456, 2);

这个查询语句可以得到以下结果:

+------------+-------------+------------------+-------------------+
| ROUND(1.5) | ROUND(-1.5) | ROUND(1.23456, 2) | ROUND(-1.23456, 2) |
+------------+-------------+------------------+-------------------+
| 2          | -2          | 1.23             | -1.23             |
+------------+-------------+------------------+-------------------+

在计算百分比时,我们也可以使用这个函数来根据需要进行四舍五入。以下的SQL语句可以将销售占比保留到整数位,并且大于等于0.5的占比向上取整:

SELECT
  product,
  date,
  CONCAT(
    IF(
      ROUND(
        IFNULL(
          (SUM(quantity) / SUM(SUM(quantity)) OVER (PARTITION BY date)),
          0
        ) * 100,
        0
      ) < 100,
      ROUND(
        IFNULL(
          (SUM(quantity) / SUM(SUM(quantity)) OVER (PARTITION BY date)),
          0
        ) * 100,
        0
      ),
      100
    ),
    '%'
  ) AS percentage
FROM sales
GROUP BY product, date;

这个查询语句在计算百分比时,使用了嵌套的IF和ROUND函数,将百分比保留到整数位,使用0.5为介数,对不足和超过这个数的占比使用不同的舍入规则。

结论

在MySQL中进行百分比计算并正确地舍入结果,是数据分析和统计中的基础操作。使用本文介绍的技术,可以轻松处理这个问题,并得到正确的百分比结果。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

MySQL 教程