我想按周查询某表(存款记录)的一个属性(金额)的和,MySQL代码如下,但由于中间有些周没有记录,查询结果不会有这些周,我想像外连接一样保留这些周(对应金额即为null或0,随便),请问如何实现?
我能想到的是建一个记录了很多连续周的表,再用外连接,但感觉有点冗余;而且感觉这类问题很常见;想问一下有没有直接一点的方法
SELECT DATE_FORMAT(DEPOSIT_TIME,'%x-%v') WEEK,SUM(AMOUNT) FROM deposit GROUP BY WEEK ORDER BY WEEK;
一年52周,列出来呗
select a.click_week,ifnull(b.count,0) as count
from (
SELECT 0 as click_week
union all
SELECT 1 as click_week
union all
SELECT 2 as click_week
union all
SELECT 3 as click_week
union all
SELECT 4 as click_week
union all
SELECT 5 as click_week
union all
SELECT 6 as click_week
union all
SELECT d as click_week
....
union all
SELECT 52 as click_week
) a left join (
select week(DEPOSIT_TIME) as click_week, count(*) as count
from deposit
group by week(DEPOSIT_TIME)
) b on a.click_week = b.click_week;
只有建一个记录了很多连续周的表吧
项目中可以写个定时任务,新建个表就存放你要的查询结果,每周执行一次,然后就只需要查这个表就行
先生成一个日历表 然后将这个日历表 转换成对应的周。
这个表保存两列数据 date 跟 week
date 的时间从1997-01-01 到2999-01-01 总共四十多万条数据 保存常用
此类问题一般有两种处理方式,最简单的就是建立关于日期的实体表,优点在于查询方便,楼上的小伙伴都已经说了,这里不再介绍;下面说一下另一种处理方式,生成关于日期的虚拟表,然后关联查询存款记录表即可.优点在于不用占用磁盘的数据空间.现在说一下具体的处理步骤.
1.创建虚拟周数表;
SELECT
@s := @s - 1 AS id,
DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL @s WEEK),'%x-%v') AS week_day
FROM
mysql.help_topic,
( SELECT @s := WEEK(CURRENT_DATE) ) temp
WHERE
@s >0
ORDER BY
week_day DESC
查询结果如下(按照当前周倒序排列):
2.关联查询存款记录表,以周为单位计算每周的总金额,按照倒叙进行排列.
select t.week_day,ifnull(SUM(deposit.`AMOUNT`),0) total_amount from (SELECT
@s := @s - 1 AS id,
DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL @s WEEK),'%x-%v') AS week_day
FROM
mysql.help_topic,
( SELECT @s := WEEK(CURRENT_DATE) ) temp
WHERE
@s >0
ORDER BY
week_day DESC) t left join deposit on t.week_day=DATE_FORMAT(deposit.`DEPOSIT_TIME`,'%x-%v') group by t.week_day order by t.week_day desc
查询结果如下:
3.检查一下统计数据是否正确
上面是按照题主提供的信息自定义的资金表,自行计算每周的资金总和:当前周资金总和50,上周20,上上周20.与查询结果一致,问题解决!
如果感觉有帮助欢迎采纳!
你是自己写着玩的,还是公司的,公司的一般都有每天的数据,在轻度聚合一下就好