mysql 查询中统计 完成率
时间: 2024-05-08 16:18:12 浏览: 137
假设我们有一个任务表(task)包括以下字段:
- id:任务编号
- name:任务名称
- start_date:任务开始日期
- end_date:任务结束日期
- status:任务状态(0:未完成;1:已完成)
要统计任务的完成率,可以使用以下 SQL 查询语句:
```mysql
SELECT
COUNT(*) AS total_tasks,
SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS completed_tasks,
ROUND(SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) / COUNT(*) * 100, 2) AS completion_rate
FROM
task;
```
该查询语句会返回三个结果:
- total_tasks:任务总数
- completed_tasks:已完成的任务数
- completion_rate:完成率(保留两位小数)
其中,SUM 函数结合 CASE 表达式可以统计已完成的任务数,ROUND 函数用于将完成率保留两位小数。
相关问题
mysql统计数据量变
### MySQL 中统计表数据量变化的方法
为了有效地监控和分析 MySQL 数据库中特定表的数据量变化情况,可以通过创建一个专门用于记录历史数据量的表格,并定期执行脚本更新该表格中的信息。具体实现方式如下:
#### 创建历史记录表
首先,在数据库内建立一张用来保存各张目标表每日行数的历史记录表 `table_size_history`。
```sql
CREATE TABLE table_size_history (
id INT AUTO_INCREMENT PRIMARY KEY,
table_name VARCHAR(64),
record_date DATE NOT NULL,
row_count BIGINT UNSIGNED DEFAULT 0,
data_length BIGINT UNSIGNED DEFAULT 0, -- 表示实际占用字节数
index_length BIGINT UNSIGNED DEFAULT 0, -- 索引所占空间大小
total_space_used BIGINT AS (data_length + index_length), -- 总共使用的磁盘空间
UNIQUE INDEX unique_record_per_day (table_name, record_date)
);
```
此结构允许按天跟踪每张被监测表的变化趋势[^1]。
#### 定期收集并插入数据
编写 SQL 脚本来计算各个重要业务逻辑对应的表每天结束时的确切条目数量及其占据的空间尺寸,并将其存入上述定义的历史日志表里。这一步骤建议通过定时任务调度工具(如 Linux 的 cron 或 Windows Task Scheduler)来自动完成。
```sql
INSERT INTO table_size_history(table_name, record_date, row_count, data_length, index_length)
SELECT
t.table_name as 'Table',
CURDATE() as 'Date',
SUM(t.table_rows) as 'Rows',
SUM(t.data_length) as 'Data Size',
SUM(t.index_length) as 'Index Size'
FROM information_schema.tables t
WHERE t.table_schema = DATABASE()
AND t.table_type = 'BASE TABLE' AND t.table_name IN ('your_target_tables') GROUP BY t.table_name;
```
这段语句会遍历指定模式下的所有基础表(`t.table_type='BASE TABLE'`),并且只针对那些预先设定的目标列表进行操作 (`IN('your_target_tables')`) 。它将获取到的信息汇总起来作为一条新的记录加入到之前提到的日志表当中去。
#### 分析数据增长趋势
有了完整的过去一段时间内的统计数据之后就可以很方便地绘制图表展示不同时间段上的增减幅度了;也可以进一步挖掘其他有用指标帮助理解系统的运行状况和发展方向。例如,可以利用聚合函数求得平均增长率或是最大最小波动区间等特性值。
```sql
WITH RECURSIVE date_series AS(
SELECT MIN(record_date) d FROM table_size_history UNION ALL
SELECT ADDDATE(d , INTERVAL 1 DAY ) FROM date_series WHERE d < (SELECT MAX(record_date) FROM table_size_history))
SELECT ds.d, COALESCE(th.row_count, 0) rows_on_that_day
FROM date_series ds LEFT JOIN table_size_history th ON ds.d=th.record_date ORDER BY ds.d ASC ;
```
以上查询构建了一个连续日期序列并与已有的测量点做左连接从而填补缺失的日子使得最终得到的结果集能够更加直观清晰地反映出整个周期里的动态演变过程。
阅读全文