MySQL按照按照某字段截取部分值后GROUP BY

本文介绍了一种使用SQL中的substr函数从特定格式的时间戳中提取年份的方法,并通过一个具体的例子展示了如何根据年份对数据进行分组统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可能用到的场景:

消费表:

有时间字段201611201230是年月日时分,但是统计是可能要按照年或者月来查询,那就可以使用substr来完成

SELECT SUM(a.ss) FROM(
SELECT substr(TALLY_TIME,1,4) tt,AMOUNT_PAID ss,FIRST_CLASSIFY_NAME FROM tally) a 
GROUP BY a.tt

这样就可以截取时间到年.从而算出每一年的统计数据

转载于:https://my.oschina.net/MrBamboo/blog/787755

<think>嗯,用户的问题是关于在达梦数据库中如何根据某个字段进行截取后进行级联统计。我需要先理解他们的需求。他们可能有一张表,其中某个字段存储了字符串,比如部门编号或者分类代码,格式可能是分层的,比如前两位代表大分类,接下来两位是中分类,最后两位是小分类。用户希望根据截取不同长度的字段来进行层级统计,比如按大分类统计总数,再在每个大分类下统计中分类,最后是小分类。 首先,我需要考虑达梦数据库的SQL语法是否支持字符串截取函数,比如SUBSTR。然后,级联统计通常可以通过GROUP BY子句结合ROLLUP或CUBE来实现,但达梦可能支持不同的语法。此外,用户可能需要使用WITH ROLLUP或者GROUPING SETS来进行多级汇总。 接下来,我需要给出一个具体的例子,假设有一个表叫dept_sales,字段dept_code类似'010203'这样的结构。用户需要按前两位、前四位、全部六位进行分组统计销售额总和。这时候应该使用SUBSTR函数来截取不同部分的部门代码,然后通过GROUP BY ROLLUP来实现层级汇总。 然后,我需要解释代码中的每个部分,比如SUBSTR的用法,GROUP BY ROLLUP的作用,以及COALESCE和CASE WHEN来处理汇总行的显示。同时,要指出达梦数据库MySQL在语法上的可能差异,比如是否支持WITH ROLLUP或者其他的扩展。 可能还需要提到其他方法,比如使用多个GROUP BY子句进行UNION ALL,或者使用GROUPING SETS来更灵活地指定分组层级。但ROLLUP可能是更简洁的方式。 在相关问题部分,应该涵盖字符串函数、级联统计的其他方法、达梦与MySQL的区别、处理汇总行标签的技巧,以及性能优化的考虑。这样用户可以有进一步的学习方向。</think>在达梦数据库中实现基于字段截取的级联统计,可以通过SQL的字符串函数结合分组聚合来实现。以下是具体实现方法: ```java // 示例SQL语句(需在达梦数据库执行) String sql = "SELECT " + " COALESCE(SUBSTR(dept_code, 1, 2), '总计') AS level1, " + " CASE WHEN GROUPING(SUBSTR(dept_code, 1, 4)) = 1 THEN '小计' " + " ELSE SUBSTR(dept_code, 1, 4) END AS level2, " + " SUM(sales_amount) AS total " + "FROM sales_data " + "GROUP BY ROLLUP(SUBSTR(dept_code, 1, 2), SUBSTR(dept_code, 1, 4)) " + "ORDER BY level1, level2"; ``` 实现原理说明: 1. 使用SUBSTR函数进行字段截取: - `SUBSTR(dept_code, 1, 2)`:截取前2位作为一级分类 - `SUBSTR(dept_code, 1, 4)`:截取前4位作为二级分类 2. 使用ROLLUP进行级联统计: - 生成分层小计和总计 - 计算顺序:先按一级+二级分组,再按一级分组,最后全表汇总 3. 使用GROUPING函数处理汇总行: - `GROUPING()`函数检测是否汇总行(返回1表示是) - `COALESCE`和`CASE WHEN`用于美化汇总行的显示 示例数据效果: ``` level1 | level2 | total -------+--------+------- 01 | 0101 | 1500 01 | 0102 | 2000 01 | 小计 | 3500 02 | 0201 | 3000 02 | 小计 | 3000 总计 | 小计 | 6500 ``` 注意事项: 1. 达梦数据库的字符串截取函数是SUBSTR(不是SUBSTRING) 2. ROLLUP的分组顺序会影响统计层次 3. 需要处理NULL(达梦默认显示NULL作为汇总标记)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值