IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SQL查询数据给前端做报表显示日期不间断 -> 正文阅读

[大数据]SQL查询数据给前端做报表显示日期不间断

最近在做数据统计,返回给前端,数据的日期还不能断,简短的做个记录

我把sql分成两个部分来做,相当于是两个结果集左关联

第一部分先做一张日期不断的时间表(月份表,年份表)

select date_add('2022-03-20',interval @i:=@i+1 day) as date from 
(
		select 1
        union all select 1
	    union all select 1
		union all select 1
		union all select 1
	    union all select 1
		union all select 1
		union all select 1
		union all select 1
		union all select 1
		union all select 1
		union all select 1
		union all select 1
		union all select 1
		union all select 1
		union all select 1
) as tmp,(select @i:= -1) t

date_add('2022-03-20',interval @i:=@i+1 day)代表在这个日期基础上加1天

(@i:=@i+1)代表定义一个变量,每次叠加1;

(SELECT @i:=-1) AS t代表建立一个临时表,t是随便取的表名,但别名一定要的。

为什么等于-1因为要算上2022-03-20这一天所以是从0开始加的.

UNION ALL 命令会列出所有的值。效果如下

连续的时间有了,那就是需要查询你想要的结果的SQL了

我需要的结果集如下

SELECT d.days,	
		sum(d.user_count) AS userCount,
        sum(d.charge_count) AS chargeCount,
        sum(d.charge_money_count) AS chargeMoneyCount,
        sum(d.power_count) AS powerCount,
        sum(d.energy_value) AS energyValue	
from area_info a
		LEFT JOIN area_station_bind b on a.id=b.area_id
		LEFT JOIN station_info c on c.id = b.station_id
		LEFT JOIN station_use_statistics d on c.id=d.station_id
		GROUP BY d.days

?这是根据日期分组,然后求字段数据的总和

两个结果集有了之后,就需要把他们进行关联结果如下

select d.date as `date` ,c.days,
    c.userCount,
    c.chargeCount,
    c.chargeMoneyCount,
    c.powerCount,
    c.energyValue 
from
(
    select date_add('2022-03-20',interval @i:=@i+1 day) as date 
        from 
		(
			select 1
            union all select 1
			union all select 1
			union all select 1
			union all select 1
			union all select 1
			union all select 1
			union all select 1
			union all select 1
			union all select 1
			union all select 1
			union all select 1
			union all select 1
			union all select 1
			union all select 1
			union all select 1
        ) as tmp,(select @i:= -1) t
) as d
left join
(
    SELECT d.days,	
	sum(d.user_count) AS userCount,
    sum(d.charge_count) AS chargeCount,
    sum(d.charge_money_count) AS chargeMoneyCount,
    sum(d.power_count) AS powerCount,
    sum(d.energy_value) AS energyValue	
	from area_info a
	    LEFT JOIN area_station_bind b on a.id=b.area_id
	    LEFT JOIN station_info c on c.id = b.station_id
		LEFT JOIN station_use_statistics d on c.id=d.station_id
		GROUP BY d.days
) as c

on d.date = DATE_FORMAT(c.days,'%Y-%m-%d')
group by d.date

on d.date = DATE_FORMAT(c.days,'%Y-%m-%d')

把这两个结果集的日期形成关联

然后要根据第一个结果集的日期进行排序这样才能够形成不断的日期表

?这是在mysql里的结果,放到项目里有几个需要解决的,就是我怎么知道要UNION ALL几列

这个可以通过计算参数的开始日期和结束日期来获取foreach的次数

select f.date as `date` ,
       c.days,
       c.userCount,
       c.chargeCount,
       c.chargeMoneyCount,
       c.powerCount,
       c.energyValue 
from
(
    select date_add(#{date1},interval @i:=@i+1 day) as date
    from 
    (
        select 1
        <foreach item="index" collection="countArr">
            union all select 1
        </foreach>
        ) as tmp,(select @i:= -1) t
    ) as f
        left join
        (
        SELECT d.days,
        sum(d.user_count) AS userCount,
        sum(d.charge_count) AS chargeCount,
        sum(d.charge_money_count) AS chargeMoneyCount,
        sum(d.power_count) AS powerCount,
        sum(d.energy_value) AS energyValue
        from area_info a
        LEFT JOIN area_station_bind b on a.id=b.area_id
        LEFT JOIN station_info c on c.id = b.station_id
        LEFT JOIN station_use_statistics d on c.id=d.station_id
        where c.dept_id = #{dept}
        <if test="stationInfoId != null">
            AND b.station_id=#{stationInfoId}
        </if>
        <if test="areaId != null">
            AND a.id=#{areaId}
        </if>

        GROUP BY d.days
        ) as c

        on f.date = DATE_FORMAT(c.days,'%Y-%m-%d'
)

     group by f.date

这是完整的过程

顺带发现了一个SQL的函数时计算两个日期之间相差多少个月


				SELECT TIMESTAMPDIFF(MONTH, '2022-03-20','2023-03-20');

但是会有一个问题就是月份相差时间会根据天数不同四舍五入

可能这个写的很复杂,希望各位大神给与指正

有更好的方法希望能留言给我,非常感谢

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:28:20  更:2022-04-01 23:30:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/20 16:26:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码