Mysql一个SQL查询搞定按天分组统计,无数据自动补0展示

对于前后端分离的项目,仪表板模块通过显示的Echarts图表显示每天前十天的订单数量,并按日期分组。
起初感觉这个问题只需一个 SQL 查询就可以轻松解决。
但在实际操作中发现,当某些日期没有数据时,图表显示不完整,例如缺少1 9 日、2 0日的数据。
这导致前端显示出现问题,需要在这些日期位置显示数量为 0 的数据以保持图表完整性。
考虑在 Java 代码中填充缺失的数据。
不过,为了减少代码量,你应该考虑这个功能是否可以直接在SQL查询中实现。
经过研究,最终设计了一个SQL查询方案。
首先,创建指定日期范围内的日期列表作为子表。
然后,这个日期列表通过链接映射链接到业务查询的原始结果集,使用日期作为关联字段。
这样,如果某一天的数据不存在,结果集会自动将数据填充为0,以保证图表能够完整显示每一天的数据。
这种方法不仅简化了代码,而且保证了数据的完整性。
按日期分组统计,实现缺失数据自动补零的高效处理,保证图表的准确性和完整性。
最终SQL查询达到了预期的目的,为前端提供了完整、准确的数据展示。

像Excel一样使用SQL进行数据分析

SQL包括类似Excel的数据分析功能,具有各种语句和功能,包括数据清洗、预处理、分类、过滤、汇总和视图操作。
下面是一种特殊的应用方法: 1 、处理重复数据:查找重复记录,统计组字段中出现的次数,过滤重复。
SELECT (昵称, 密码 FROM 用户 GROUPBY昵称, 密码HAVINGCOUNT(昵称)>1 ) FROM 用户(昵称, 密码);删除重复记录:将每个重复记录中ID最小的记录放入,并删除其他重复记录。
DELETEc1 FR​​OMcustomerc1 ,customerc2 WHEREc1 .cust_email=c2 .cust_emailANDc1 .id>c2 .id; 2 .缺失值处理查找缺失值:使用ISNULL条件过滤空值记录。
SELECT * FROM customerWHEREcust_emailISNULL;填充空值:用常量值或UPDATE语句中的计算值替换空值。
UPDATEsaleSETcity="未知" WHEREcityISNULL;UPDATEorderitemsSETprice_new=IFNULL(price_new,5 .7 4 );3 .计算列 添加计算列:通过 ALTERTABLE 添加列并使用 UPDATE 填充计算结果。
可更改的订单项目SADDprice_newDECIMAL(8 ,2 )NOTNULL;更新订单项目SETprice_new=item_price*number;查询计算列:直接用SELECT指定计算语句。
SELECTitem_price*销售数量 FROM orderitems; 4 、排序和层次排序 多列排序:按多个字段优先级、升序(ASC)和降序(DESC)排序。
FROM 订单商品 ORDERBYprice_newDESC,数量;查询前N条记录:使用LIMIT限制结果条数。
FROM 订单商品 ORDERBYprice_newDESCLIMIT5 ;排名计算:统计子查询中大于或等于当前值的唯一值的个数作为排名。
产品价格,(SELECTCOUNT(DISTINCTprod_price) FROM productsWHEREprod_price >= a.prod_price) ASrankFROMproductsASAORDERBYrank; 5 、字符串编译器字符串替换:使用REPLACE函数替换指定内容。
UPDATEdata1 SETcity=replace(city,'SH','上海');字符串截取:位置截取:LEFT(左)、RIGHT(右)、SUBSTRING(中心)。
SELECTLEFT('example.com',3 );--'exa' SELECTSUBSTRING('example.com',4 ,2 ) RETURN; -- 按分隔符截断 return 'mp': SUBSTRING_INDEX 根据分隔符的位置截断。
SELECTSUBSTRING_INDEX('www.google.com','.',1 );--返回'www' 6 .过滤数据 高级过滤:使用AND、OR、IN、NOT等逻辑运算符组合条件。
prod_name、product_priceFROM productsWHEREvend_idIN('DLL01 ','BRS01 ')ANDprod_price>1 00;荒野卡片过滤器:LIKE、_(单个字符)与%(任意字符)结合以获得模糊匹配。
SELECT *COUNTRY LIKE 'CH%' FROMcustomers;-- 匹配以 'CH' 开头的国家/地区 SELECTvend_id,prod_name,prod_priceFROMVendorsINNERJOINProductsONVendors.vend_id=Products.vend_id;多表连接:使用 WHERE 子句匹配多个表。
产品名称、供应商名称、产品价格、订单商品数量、产品、供应商WHEREProducts.vend_id=Vendors.vend_idANDOrderItems.prod_id=Products.prod_idANDorder_num=2 0007 ;自连接:在单个 SELECT 中多次查找同一个表,以实现复杂查询。
SELECTc1 .cust_id,c1 .cust_nameFROMCustomersASc1 ,customersASc2 WHEREc1 .cust_name=c2 .cust_nameANDc2 .cust_contact='JimJones'; 8 . 数据透视组摘要:按 GROUPBY 分组并必须过滤组结果。
order_num,COUNT(*) 个商品来自 order_itemsGROUPBYorder_numHAVINGCOUNT(*)>=3 ;交叉表:使用 CASEWHEN 将行转换为列,以获得类似于 Excel 数据透视表的结果。
SELECTcity,MAX(CASEWHENcolor='A'THENpriceEND)ASA,MAX(CASEWHENcolor='B'THENpriceEND)ASBFROMdata1 GROUPBYcity;通过上述SQL操作,可以高效地完成数据清洗、转换和分析操作。
它特别适合处理大规模数据集,性能比Excel的行冻结程序要好得多。
实际使用时,应根据数据库类型(如MySQL、PostgreSQL)调整语法细节。