我有一张表,下面有三栏

Date      table_name    count
1/6/2023    table1    5161454381
1/6/2023    table2    286759521
1/6/2023    table3    43756630
1/6/2023    table4    27032087
1/6/2023    table5    44189394
1/6/2023    table6    63475022
1/5/2023    table1    5362300063
1/5/2023    table2    289459360
1/5/2023    table3    59042261
1/5/2023    table4    37256587
1/5/2023    table5    55511764
1/5/2023    table6    77917391
1/4/2023    table1    5316875841
1/4/2023    table2    282894202
1/4/2023    table3    57226525
1/4/2023    table4    36150830
1/4/2023    table5    54099874
1/4/2023    table6    75897787
1/3/2023    table1    5301932742
1/3/2023    table2    281278819

我需要添加一个平均为每一天以及每一桌.举个例子, 假设日期是2023-01-06,表格是表1,我需要得到过go 两周同一星期的平均值.平均2023-01-06(星期五)的平均值是用2022-12-30和2022-12-23计算的.两个都是星期五.那么它应该会显示出来.然后,我需要将其显示为数据透视表.

enter image description here

我try 了如下,但平均参与是不正确的,有人能帮忙改变那部分以获得所需的输出吗?

SELECT
    t1.table_name as table_name,
    MAX(CASE WHEN table_date=DATE_SUB(CURDATE(), INTERVAL 4 DAY) THEN count END) AS '$date04',
    MAX(CASE WHEN table_date=DATE_SUB(CURDATE(), INTERVAL 3 DAY) THEN count END) AS '$date03',
    MAX(CASE WHEN table_date=DATE_SUB(CURDATE(), INTERVAL 2 DAY) THEN count END) AS '$date02',
    MAX(CASE WHEN table_date=DATE_SUB(CURDATE(), INTERVAL 1 DAY) THEN count END) AS '$date01',
    t2.AVG
FROM tbl t1
INNER JOIN
(
    SELECT table_name, AVG(count) AS AVG
    FROM tbl
    where table_date >= DATE(NOW() - INTERVAL 14 DAY)
    GROUP BY table_name
) t2
    ON t2.table_name = t1.table_name
where table_date >= DATE(NOW() - INTERVAL 4 DAY) and t1.table_name not in ('table7')
group by t1.table_name;

推荐答案

首先,将列名从Date更改为其他名称.我用的是Datee

try

WITH  cte1 AS (SELECT DISTINCT(table_name) FROM tbl)
SELECT table_name,
(SELECT count FROM tbl WHERE Datee=DATE_SUB(CURDATE(), INTERVAL 3 DAY) AND tbl.table_name=cte1.table_name) AS '$date04',
(SELECT AVG(count) FROM tbl WHERE Datee IN (DATE_SUB(CURDATE(), INTERVAL 3+7 DAY),DATE_SUB(CURDATE(), INTERVAL 3+14 DAY)) AND 
tbl.table_name=cte1.table_name) AS avg1,
(SELECT count FROM tbl WHERE Datee=DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND tbl.table_name=cte1.table_name) AS '$date03',
(SELECT AVG(count) FROM tbl WHERE Datee IN (DATE_SUB(CURDATE(), INTERVAL 2+7 DAY),DATE_SUB(CURDATE(), INTERVAL 2+14 DAY)) AND 
tbl.table_name=cte1.table_name) AS avg2,
(SELECT count FROM tbl WHERE Datee=DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND tbl.table_name=cte1.table_name) AS '$date02',
(SELECT AVG(count) FROM tbl WHERE Datee IN (DATE_SUB(CURDATE(), INTERVAL 1+7 DAY),DATE_SUB(CURDATE(), INTERVAL 1+14 DAY)) AND 
tbl.table_name=cte1.table_name) AS avg3,
(SELECT count FROM tbl WHERE Datee=DATE_SUB(CURDATE(), INTERVAL 0 DAY) AND tbl.table_name=cte1.table_name) AS '$date01',
(SELECT AVG(count) FROM tbl WHERE Datee IN (DATE_SUB(CURDATE(), INTERVAL 0+7 DAY),DATE_SUB(CURDATE(), INTERVAL 0+14 DAY)) AND 
tbl.table_name=cte1.table_name) AS avg4
 FROM cte1;

此外,如果希望使用像03-01-2023这样的日期值作为实际列名,则可能需要使用动态SQL

Mysql相关问答推荐

完全相同的A B表达在SQL中的不同上下文中意外返回不同的结果

mysql查询汇总数据

用于搜索从各种表中获得的结果的查询

根据上一行S列结果计算列的查询

奇怪的MySQL SELECT循环;但不是\G

SQL 查询仅当成员共享确切值时才 Select 成员对

Mysql根据文本语言或行数将列拆分为多列

如何编写一个查询,计算表中每个日期的一个日期加上前 4 天的记录数?

如何在 MySQL 中查找重复值和更新值

如何查询由另一个查询创建的表?

根据单个日期字段获取范围/天数

即使使用索引,MySQL 计数和按查询分组也很慢

MySql中的可见索引和不可见索引是什么

如何在 MYSQL 中使用多个表进行插值

Golang Gorm 没有创建带有约束的表

减少mysql中的值但不是负数

我可以在单个 Amazon RDS 实例上创建多少个数据库

如何从两个不同的日期获得年份差异?

警告:mysqli_connect(): (HY000/1045): Access denied for user 'username'@'localhost' (using password: YES)

如何通过一个语句描述数据库中的所有表?