sql 行转列 日周月 图表统计

目录

目录

需求

准备

分析

按月分组

行转列

错误版本

正确版本

分析

行转列

分析

按周分组

行转列

本年


需求

页面有三个按钮  日周月,统计一周中每天(日),一月中每周(周),一年中每月(月),设备台数

点击 按钮月,出现类似下图这种

返回给前端,如果某个月份没有数据,x轴该月份不是没有了嘛,当然可以有其他方式来解决,本文主要讲下行转列

准备

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for robot
-- ----------------------------
DROP TABLE IF EXISTS `robot`;
CREATE TABLE `robot`  (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`createtime` datetime NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of robot
-- ----------------------------
INSERT INTO `robot` VALUES (1, '1号机器人', '2024-02-02 23:07:37');
INSERT INTO `robot` VALUES (2, '2号机器人', '2024-01-01 23:07:37');
INSERT INTO `robot` VALUES (3, '3号机器人', '2024-02-02 23:07:37');
INSERT INTO `robot` VALUES (4, '4号机器人', '2024-01-01 15:41:42');
INSERT INTO `robot` VALUES (5, '5号机器人', '2024-03-03 15:51:25');
INSERT INTO `robot` VALUES (6, '6号机器人', '2024-01-26 11:34:46');SET FOREIGN_KEY_CHECKS = 1;

注:此处举例都是同一年,其他年份where过滤一下即可,过滤方式于文章末尾

分析

需要按照月去统计,那么将相同月合为一组,统计ID为数量即可,那月怎么划分?

从第6位开始后两位即为月,SUBSTRING(createtime, 6, 2)

按月分组

SELECT SUBSTRING(createtime, 6, 2) dayOfMonth, count(ID) num
FROM `robot`
GROUP BY SUBSTRING(createtime, 6, 2)

行转列

错误版本

select
case when dayOfMonth = 1 then num else 0 end January,
case when dayOfMonth = 2 then num else 0 end February,
case when dayOfMonth = 3 then num else 0 end March,
case when dayOfMonth = 4 then num else 0 end April,
case when dayOfMonth = 5 then num else 0 end May,
case when dayOfMonth = 6 then num else 0 end June,
case when dayOfMonth = 7 then num else 0 end July,
case when dayOfMonth = 8 then num else 0 end August,
case when dayOfMonth = 9 then num else 0 end September,
case when dayOfMonth = 10 then num else 0 end October,
case when dayOfMonth = 11 then num else 0 end November,
case when dayOfMonth = 12 then num else 0 end December
from (SELECT SUBSTRING(createtime, 6, 2) dayOfMonth, count(ID) numFROM `robot`GROUP BY SUBSTRING(createtime, 6, 2)
) t

????????????   

咋就成这样了,难不成每次 case when 同一个字段 end 不同字段 时他会将之前的结果表每行都扫描一次?那我取有值的一次是不是就解决了?怎么取?有值的那次是最大的

正确版本

select
MAX(case when dayOfMonth = 1 then num else 0 end) January,
MAX(case when dayOfMonth = 2 then num else 0 end) February,
MAX(case when dayOfMonth = 3 then num else 0 end) March,
MAX(case when dayOfMonth = 4 then num else 0 end) April,
MAX(case when dayOfMonth = 5 then num else 0 end) May,
MAX(case when dayOfMonth = 6 then num else 0 end) June,
MAX(case when dayOfMonth = 7 then num else 0 end) July,
MAX(case when dayOfMonth = 8 then num else 0 end) August,
MAX(case when dayOfMonth = 9 then num else 0 end) September,
MAX(case when dayOfMonth = 10 then num else 0 end) October,
MAX(case when dayOfMonth = 11 then num else 0 end) November,
MAX(case when dayOfMonth = 12 then num else 0 end) December
from (SELECT SUBSTRING(createtime, 6, 2) dayOfMonth, count(ID) numFROM `robot`GROUP BY SUBSTRING(createtime, 6, 2)
) t

分析

需要一个函数帮我确定给定的日期是星期几,然后再分组统计

SELECT DAYNAME(createtime) dayOfWeek, count(ID) num	
FROM `robot` 
GROUP BY DAYNAME(createtime) 

行转列

select
MAX(case when dayOfWeek = 'Monday' then num else 0 end) Monday,
MAX(case when dayOfWeek = 'Tuesday' then num else 0 end) Tuesday,
MAX(case when dayOfWeek = 'Wednesday' then num else 0 end) Wednesday,
MAX(case when dayOfWeek = 'Thursday' then num else 0 end) Thursday,
MAX(case when dayOfWeek = 'Friday' then num else 0 end) Friday,
MAX(case when dayOfWeek = 'Saturday' then num else 0 end) Saturday,
MAX(case when dayOfWeek = 'Sunday' then num else 0 end) Sunday
from (SELECT DAYNAME(createtime) dayOfWeek, count(ID) num	FROM `robot` GROUP BY DAYNAME(createtime) 
) t

公司要求的是:

1-7号固定为第一周,8-14号固定为第二周,15-21固定为第三周,剩下的为第四周

注:如果不是这种规则,网上找找周相关函数,很容易找到的

分析

需要按照他们定的规则划分周,那我怎么知道日期几号?

SUBSTRING(createtime, 9, 2)    9号位置开始后两位为天

按周分组

	SELECT CASE WHEN SUBSTRING(createtime, 9, 2) <= 7 THEN 'firstWeek'WHEN SUBSTRING(createtime, 9, 2) <= 14 THEN 'secondWeek'WHEN SUBSTRING(createtime, 9, 2) <= 21 THEN 'thirdWeek'ELSE 'fourWeek' END as `week`, count(ID) numFROM `robot` GROUP BY CASE WHEN SUBSTRING(createtime, 9, 2) <= 7 THEN 'firstWeek'WHEN SUBSTRING(createtime, 9, 2) <= 14 THEN 'secondWeek'WHEN SUBSTRING(createtime, 9, 2) <= 21 THEN 'thirdWeek'ELSE 'fourWeek' END

行转列

select
MAX(case when `week` = 'firstWeek' then num else 0 end) firstWeek,
MAX(case when `week` = 'secondWeek' then num else 0 end) secondWeek,
MAX(case when `week` = 'thirdWeek' then num else 0 end) thirdWeek,
MAX(case when `week` = 'fourWeek' then num else 0 end) fourWeek
from (SELECT CASE WHEN SUBSTRING(createtime, 9, 2) <= 7 THEN 'firstWeek'WHEN SUBSTRING(createtime, 9, 2) <= 14 THEN 'secondWeek'WHEN SUBSTRING(createtime, 9, 2) <= 21 THEN 'thirdWeek'ELSE 'fourWeek' END as `week`, count(ID) numFROM `robot` GROUP BY CASE WHEN SUBSTRING(createtime, 9, 2) <= 7 THEN 'firstWeek'WHEN SUBSTRING(createtime, 9, 2) <= 14 THEN 'secondWeek'WHEN SUBSTRING(createtime, 9, 2) <= 21 THEN 'thirdWeek'ELSE 'fourWeek' END
) t

本年

将上面的sql用下面 where 后面的过滤一下即可

SELECT *
FROM robot
WHERE YEAR(createtime) = YEAR(CURDATE());	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/650278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用的gpt-4 prompt words收集8

本文介绍我最近收集的一些好用的chatgpt-4的prompts&#xff0c;如果你也有好用的提示词可以互相交流一下。 1. I ran into some trouble on my way to work. 迟到原因 2. In my heart, the most delicious coffee is the Hawaii Dirty from Manner. Only the Nong series a…

新概念英语第二册(42)下

【Key structures】 “have 名词”代替普通动词 “have 名词”代替普通动词表示“完成该动作”&#xff1a;have a bathbathe &#xff1b;have a swimswim&#xff1b;have a walkwalk&#xff1b;have a looklook&#xff1b;have a restrest&#xff1b;have a smell…

8-小程序数据promise化、共享、分包

小程序API Promise化 wx.requet 官网入口 默认情况下&#xff0c;小程序官方异步API都是基于回调函数实现的 wx.request({method: , url: , data: {},header: {content-type: application/json // 默认值},success (res) {console.log(res.data)},fail () {},complete () { }…

Maven命令运行单元测试

使用idea开发多模块项目时,有时别的模块编译不通过会导致不能运行单元测试,这是我们可以使用maven命令来运行单元测试 格式 mvn -DtestDingTalkTest#getAllUsers 命令说明 mvn -Dtest 固定格式 DingTalkTest 单元测试类名 getAllUsers 单元测试方法 单元测试类和单元测试方法…

洛谷 P1098 [NOIP2007 提高组] 字符串的展开

题目链接 分析 这题分为几个函数实现&#xff1a;判断是否展开、输出 m m m 次某个字符、循环展开。 坑点 有可能会有几个 - 号连续出现。转换大小写时&#xff0c;必须先判断其是否为大小写&#xff0c;如果不是才转换。- 号两端如果相等也不行。 代码 #include <bi…

MySQL--选择数据库(3)

在你连接到 MySQL 数据库后&#xff0c;可能有多个可以操作的数据库&#xff0c;所以你需要选择你要操作的数据库。 从命令提示窗口中选择 MySQL 数据库 在 mysql> 提示窗口中可以很简单的选择特定的数据库。 在 MySQL 中&#xff0c;要选择要使用的数据库&#xff0c;可…

Unity存储信息加密

注释 unity保存关键数据的的方法和解析方法&#xff0c;防止用户改动 using Newtonsoft.Json; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Networking;public class UserData {public int id; } …

六、Kotlin 类型进阶

1. 类的构造器 & init 代码块 1.1 主构造器 & 副构造器在使用时的注意事项 & 注解 JvmOverloads 推荐在类定义时为类提供一个主构造器&#xff1b; 在为类提供了主构造器的情况下&#xff0c;当再定义其他的副构造器时&#xff0c;要求副构造器必须调用到主构造器…

洛谷C++简单题练习day6—P1830 城市轰炸

day6--P1830 城市轰炸--1.26 习题概述 题目背景 一个大小为 nm 的城市遭到了 x 次轰炸&#xff0c;每次都炸了一个每条边都与边界平行的矩形。 题目描述 在轰炸后&#xff0c;有 y 个关键点&#xff0c;指挥官想知道&#xff0c;它们有没有受到过轰炸&#xff0c;如果有&a…

三件套之三,完美句号,下期有惊喜……

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; CAXA CAD电子图板2024是一款强大的二维CAD绘图软件&#xff0c;它具有易学易用、稳定高效和性能优越等特点。使用这款软件&#xff0c;用户不仅可以更…

Python网络爬虫实战——实验6:Python实现js逆向与加解密

【实验内容】 本实验主要介绍在数据采集过程中对js代码进行分析从而对加密字段进行解密。 【实验目的】 1、理解js逆向工程的概念 2、学会逆向工程中的加解密分析 【实验步骤】 步骤1 理解js逆向工程的概念 步骤2 学会逆向工程中的加解密分析 步骤3 采集广东政府采购网 步…

Jmeter接口测试-websocket测试

壹 Jmeter接口测试-websocket测试 测试之前的准备工作,需要websocket插件 方式一: 去github下载: https://github.com/maciejzaleski/JMeter-WebSocketSampler/wiki/Dependencies jetty-http-9.1.2.v20140210.jarjetty-io-9.1.2.v20140210.jarjetty-util-9.1.2.v20140210…

真香一个团队协作工具部署

部署 version: "3.4"services:mongo:image: mongocontainer_name: twake-dbvolumes:- /opt/Twake/data:/data/dbnode:image: twaketech/twake-node:latestcontainer_name: twake-webports:- 3345:3000# - 8000:3000environment:- DEVproduction- SEARCH_DRIVERmong…

IndexedDB

Web SQL Database | Can I use... Support tables for HTML5, CSS3, etc IndexedDB | Can I use... Support tables for HTML5, CSS3, etc 为什么websql被废弃&#xff1f;_笔记大全_设计学院 WebSQL有兼容、性能、安全问题&#xff0c;要考虑使用IndexedDB替代。 一文看懂 In…

幻兽帕鲁搭建私服,一键更新方法

看着帕鲁这么火&#xff0c;估计更新会变为常态了&#xff0c;如果有自己搭建私服的话&#xff0c;跟着我下面的方法去进行更新吧&#xff01; 如果你还没有自己的私服&#xff0c;快去三五十搞一个吧&#xff0c;只需三五分钟&#xff0c;叫上你的小伙伴一起去搞起来吧 只需3分…

【自然语言处理的发展】

自然语言处理的发展 自然语言处理&#xff08;NLP&#xff09;作为人工智能领域的一个分支&#xff0c;旨在让计算机理解和生成人类语言。随着深度学习和大数据技术的不断进步&#xff0c;NLP在近年来取得了显著的突破。本文将探讨NLP技术的发展历程、最新技术进展以及未来展望…

vscode vim 快捷键汇总

需满足操作&#xff1a; 上下移动按照 word 移动选中增删改查找字符/变量移动、增加、复制、删除 行选中多个相同的变量/字符屏幕移动增加多个光标快速注释 上下左右移动 CommandDescription&#x1f522; hleft (also: CTRL-H, BS, or Left key)&#x1f522; lright (also…

如何在Shopee平台上进行宠物类目的选品丨shopee宠物选品

在Shopee平台上进行宠物类目的选品是一个重要的任务&#xff0c;它直接关系到卖家的销售业绩和市场竞争力。为了成功选择适合的宠物用品&#xff0c;在选品过程中&#xff0c;卖家可以遵循以下策略&#xff1a; 先给大家推荐一款shopee知虾数据运营工具知虾免费体验地址&#…

vue3项目中使用Arco Design-Table组件结合h()函数生成表格嵌套表格效果

vue3项目中使用Arco Design-Table组件【点击跳转】结合vue3-h()函数【点击跳转】生成表格嵌套表格效果。 示例效果如下&#xff1a; 【方式一】 给Table组件设置表格的“展开行配置”参数&#xff1a;expandable <a-table :expandable"expandable"></a-t…

ZYNQ程序固化

文章目录 一、简介二、固化操作2.1 生成固化文件2.2 固化到SD卡2.3 固化到Flash 参考 将程序存储在非易失性存储器中&#xff0c;在上电或者复位时让程序自动加载运行。 这个过程需要启动引导程序( Boot Loader)参与&#xff0c;Boot Loader会加载FPGA配置文件&#xff0c;以及…