sql: case when, distinct, group by, group_concat

最近做了个报表,痛苦了半年,终于搞出来了,知道了一些sql用法,

如:

case colom when colom then expr1 else expr2 end, //类似switch case可以有多个when

distinct, group by,//都是取出重复记录的,但是distinct无法显示不重复的其他记录。

mysql的 group_concat(colom SEPARATOR ',') 将字符串字段以分隔符号相连

 

下面是一张机票的表(airTicket)

 

     出发地 到达   往返         机票状态    价格

-------------------------------------------------

id   from    to    back       status       price

----------------------------------------------------

1   a         b      true      confirm   800

----------------------------------------------------

2   c         d      false     cancle     600

----------------------------------------------------

3   c         f      true      cancle     400

----------------------------------------------------

4   a         c      false     confirm    300

 

假设要统计不同状态下的机票的总价格和去过的不同地区,去过的地区就是to的地区,如果是往返的机票,from的也包括。

我的实现如下:

 

select status, count(id), sum(price), group_concat(to),

group_concat(case back when back then from else to end)

from airTicket

group by status; 

 

result:

 

cancel      2    1000      d,f         d,c

-------------------------------------------

confirm    2     1100      b,c        a,c

 

得到上面的字符串之后在计算去过的不同的地区就可以将两个段链接起来,split然后去掉重复的就知道有多少个了。

 

cancel = 3  confirm = 3

 

其实上面语句最复杂的就是统计地区了,需要根据是否是往返机票(back)合并出发地(from)和到达地(to),并且统计出不同的地区。我能实现的方式就是这样了,而且使用了mysql特有的group_concat 方法,如果谁能够替代此方法,请一定回个帖子。

 

通过MySQLDialect 方式让hibernate支持mysql的group_concat

http://hi.baidu.com/ayu1106/blog/item/4da6810efd140ae237d122f3.html

 

==========================================

 

对于distinct和group by是这样一个类似版本管理的记录

 

 

firename         version

-------------------------------

a                      1

-------------------------------

b                      1

-------------------------------

a                      2

 

现在想找到每个文件的最近版本结果如下:

 

a                 2

------------------

b                 1

 

如果使用distinct 可以

select distinct firename from table order by firename, version DESC;

这样只能显示出来firename一列,如果想显示多列,那么可以通过 

 

select firename, version from table t where version =

(select max(version) from table where firename = t.firename)

group by firename

 

其实有高人已经总结了很多方式:

 

http://www.cnblogs.com/kangtr/archive/2008/02/25/1080278.html

 

 

MySQL中group_concat函数的高级应用与实战技巧 本文深入探讨了MySQL中group_concat函数的高级应用与实战技巧,包括distinct去重、order by排序和separator分隔符的创意用法。通过电商平台、内容管理系统等真实案例,展示了如何解决长度截断、NULL值处理等常见问题,并提供了性能优化建议和最佳实践,帮助开发者高效实现字符串聚合需求。 阅读详情

相关推荐

win11 labelme 汉化菜单

【代码】win11 labelme 汉化菜单。

一直记录 1169

HQL函数大全

HQL函数大全 一、关系运算 等值比较: = 等值比较: <=> 不等值比较: <>和!= 小于比较: < 小于等于比较: <= 大于比较: > 大于等于比较: >= 区间比较: between and 空值判断: IS NULL 非空判断: IS NOT NULL LIKE比较: 使用通配符 like ‘%a%’| ‘_a_’|concat(’%’,’’,’%’) JAVA的LIKE操作: 使用正则表达式 A rlike 正则表达’

weixin_43351279的博客 7348

fNIRS 公开数据集整理

关注“心仪脑”查看更多脑科学知识的分享。 关键词:数据整理、fNIRS 之前我们向大家推送了 Public Neuroscience Dataset 系列主题的第一期:《EEG公开数据集》,我们同时意识到大家对于神经科学公开数据集的需求。本期是该系列主题的第二期,我们在延续第一期初衷的基础上,整理了功能性近红外光谱(fNIRS)技术的公开数据集。 fNIRS 是一种非侵入性、便携且价格低廉的光学神经成像技术,它具有可观的空间和时间分辨率。因fNIRS技术问世较EEG晚了许多,所以应用此技术开展研究发.

psybrain的博客 4272

Oracle-MySQL:concat、distinct以及case when then else end的方法使用

一、ORACLE-MySQL中concat函数(连接字符串) 1.concat函数:concat(str1,str2,…)  返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL。 select concat('11','22',null); +-------------------...

Odyssues_lee的博客 3460

基于STM32与OV7670的嵌入式视频监控系统设计与实现

本文详细介绍了基于STM32单片机与OV7670摄像头的嵌入式视频监控系统设计与实现。从硬件选型、电路设计到软件开发,涵盖了摄像头驱动、TFT显示优化及图像处理等关键技术,提供了实用的调试技巧和性能优化方案,为低成本、高效率的视频监控系统开发提供完整解决方案。

desk3的博客 802

从报错到优化:一次Gauss JDBC参数限制排查实录(32767参数上限避坑指南)

本文详细记录了排查GaussDB JDBC驱动因绑定参数数量超过32767上限而抛出`PSQLException`(报错信息为`Tried to send an out-of-range integer as a 2-byte value`)的全过程。文章深入分析了该限制的底层协议原理,并提供了应用层分批查询、使用临时表以及优化业务逻辑等多种解决方案,旨在帮助开发者规避此参数上限陷阱,构建更稳健的数据访问层。

rgv23456789的博客 218

inner join 重复数据_数据分析-SQL-多表查询

内容目录表的加法多表关联多表关联应用案例case when 表达式练习题一.表的加法 (union,union all)EXCEL的应用场景中经常会有表的追加,追加是指行追加,列名称都一样的 不同记录的表工作场景中经常会有 1月份 2月份 3月份......每个月份 或者 不同合作部门提供给你的数据表(前提是表的列数是一样的)的数据记录要追加到一张表里便于做数据透视表SQL中追加相同表结构的表的记...

weixin_39750410的博客 1685

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》标准解读

GB 44497-2024《智能网联汽车 自动驾驶数据记录系统》针对智能网联汽车的自动驾驶数据记录系统进行了全面规范。标准要求我们记录车辆在自动驾驶模式下的所有关键操作数据,如:1. 车辆状态数据,如速度、加速度、转向角度、制动状态等;2. 环境感知数据,如周围物体的位置、速度、类型等;3. 驾驶决策数据,如路径规划、避障决策、紧急制动指令等;4. 系统状态数据,如软件版本、硬件状态、系统警告信息等。在数据存储方面,标准强调了数据的安全性和可靠性。

daopuyun的博客 2670

SQL语句 case when else end 、distinct 、<>0

case when else end:     case                   -------------如果     when sex='1' then '男' -------------sex='1',则返回值'男'     when sex='2' then '女' -------------sex='2',则返回值'女'       else 0           

qq_36604180的博客 1557

《网络安全自学教程》- 防火墙原理分析与Windows防火墙使用配置

防火墙分类及原理,Windows开启防火墙,Windows防火墙添加策略,

wangyuxiang946的博客 1万+

【异常】Openclaw Gateway进程异常停止问题分析与解决方案

本文分析了Gateway服务异常停止的问题,提出了三种解决方案。核心问题是缺乏进程守护和自动恢复机制,导致服务崩溃后无法自行重启。推荐方案是使用PM2进程管理工具(方案1),提供进程监控、自动重启和开机自启功能。替代方案包括自定义守护脚本(方案2)和supervisord管理(方案3)。这些方案都能有效解决当前服务脆弱性问题,显著提升服务可用性,其中PM2方案成熟度高、配置简单,是首选解决方案。实施后可将服务从人工干预转变为自动恢复,确保业务连续性。

奶爸的编程之路,也就一周冷个三天 457

case..when..then

CASE是 SQL用来做为 if-then-else 之类逻辑的关键字。 //语法: SELECT CASE ("栏位名")     WHEN " 条件1" THEN "结果1"     WHEN " 条件2" THEN "结果2"     ...     [ELSE " 结果N"]     END FROM "表格名" 注:" 条件"  可以是一个数值或是公式。  ELS

狗尾巴树 969

测风数据垂直外推(原理及Windowgrapher操作示范)

垂直外推

weixin_46713695的博客 896

SQL实现按用户偏好进行分组汇总_自定义聚合规则

JSON_OBJECT_AGG 的 key 必须是单值,不能是表达式,所以得先用子查询或 CTE 把 pref_type 和 pref_value 拆成两列MySQL 的 GROUP_CONCAT(DISTINCT pref_value ORDER BY pref_value SEPARATOR '|') 要显式加 DISTINCT,否则同一用户多次设置同一偏好会重复出现聚合前务必 WHERE pref_value IS NOT NULL AND pref_value!

274

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

sql转置 -- 行转列,使用case when、if

SQL转置 转置使用 case when 或 if都可以。但是,若需要group by,则需要对case when 或 if 使用聚合函数。即: group by和聚合函数要么都出现,要么都不出现。 实现代码中用到了MAX函数,这个很重要,它可以返回多个字符串中ASCII最大的字符串, 不过使用中要注意,它可能改变返回的数据类型(String-&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;BLOB)。 另外,MA...

慢慢来 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)

列转行: 多列转多行 行转列:多行转多列 以下转自:https://www.cnblogs.com/ClassNotFoundException/p/6860615.html 列转行:利用max(case when then) SELECT `name`, MAX( CASE WHEN course...

weixin_34344677的博客 811

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

mysql的max case,MySQL — 行转列 — GROUP_CONCAT — MAX(CASE WHEN THEN)

列转行: 多列转多行行转列:多行转多列#以下转自:https://www.cnblogs.com/ClassNotFoundException/p/6860615.html列转行:利用max(case when then)SELECT`name`,MAX(CASEWHEN course='语文' THENscoreEND) AS 语文,MAX(CASEWHEN course='数学' THENs...

weixin_42113552的博客 408

【MySQL性能优化】DISTINCT和GROUP BY去重性能深度剖析

🔥 本文通过100W数据的实战测试,对比MySQL中DISTINCT与GROUP BY的去重性能差异。测试结果显示两者性能差异仅5%左右,但GROUP BY在后续数据聚合、统计分析等操作上具有显著优势。

Pte_moon的博客 882

MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)

列转行:利用max(case when then) SELECT `name`, MAX( CASE WHEN course='语文' THEN score END ) AS 语文, MAX( CASE WHEN...

118

mysql 行转列 case_MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)

列转行:利用max(case when then) SELECT`name`,MAX(CASEWHEN course='语文' THENscoreEND) AS 语文,MAX(CASEWHEN course='数学' THENscoreEND) AS 数学,MAX(CASEWHEN course='英语' THENscoreEND) AS 英语FROMstudentGROUP BY `name...

weixin_33416697的博客 163

GROUP BY + COUNT 用法拓展

COUNT(字段)忽略 NULL,不忽略空字符串'';自动过滤 NULL,NULL 不参与去重;GROUP BY 后 WHERE 不能写聚合函数,必须放 HAVING;多字段同时非 NULL 计数,MySQL 不能用 COUNT (col1,col2),要用 CASE;窗口 COUNT 不会合并分组,GROUP BY COUNT 会压缩分组;条件计数优先,比子查询、SUM (IF) 可读性更强。

ths512的博客 303

mysql then concat_MySQL -- 列转行 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)

列转行:利用max(case when then)SELECT`name`,MAX(CASEWHEN course='语文' THENscoreEND) AS 语文,MAX(CASEWHEN course='数学' THENscoreEND) AS 数学,MAX(CASEWHEN course='英语' THENscoreEND) AS 英语FROMstudentGROUP BY `name`;...

weixin_35876682的博客 185

SQL 小妙招

SQL 小妙招if(a,b,c)COALESCE(a,b)DISTINCTCASE WHEN ELSE ENDCONCAT(a,b) if(a,b,c) if a == true return b else return c COALESCE(a,b) if a is not null return a DISTINCT 去除重复行 CASE WHEN ELSE END 假如,表date a b 0 100 1 10 2 50 SELECT (CASE date.

GAMEOVER_Lv9的博客 316

复杂sql case when distinct

case when distinct

qq_17152035的博客 1317

mysql语句高级用法使用记录和sql_mode=only_full_group_by错误解决

GROUP_CONCAT合并字符几种常规用法,sql_mode=only_full_group_by 报错,SUBSTRING_INDEX 按设定隔符截取字符串,case when的使用,高级用法,

情話微甜 的博客 1821

mysql的max case_MySQL -- 行转列 -- GROUP_CONCAT -- MAX(CASE WHEN THEN)

列转行:利用max(case when then)SELECT`name`,MAX(CASEWHEN course=‘语文‘ THENscoreEND) AS 语文,MAX(CASEWHEN course=‘数学‘ THENscoreEND) AS 数学,MAX(CASEWHEN course=‘英语‘ THENscoreEND) AS 英语FROMstudentGROUP BY `name`;...

weixin_39834406的博客 277
上一篇: Java 回调(callback) 内部类(innerclass)
下一篇: postgresql 资源和安装
xiaoxinphp
博客等级 码龄18年 1粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值