sql的max用法之不解之谜

现有一数据库表,如图:
图片说明
表结构说明:stu_id为学生id,class_id为课程id,class_name为课程名称,main_class_flag表示是否为主修课程,Y表示是,N表示否!!
现在根据需求查询:只选修一门课程的人,返回那门课程的ID和选修多门课程的人,返回所选的主课程ID。
现我通过查询语句:
select stu_id,case when count(*) = 1 then class_id
else (case when main_class_flag = 'Y' then class_id else NULL END) END as classid
from courses group by stu_id;
得到如下结果:
图片说明
但是如果再第二个case when前加上max,即:
select stu_id,case when count(*) = 1 then class_id
else max(case when main_class_flag = 'Y' then class_id else NULL END) END as classid
from courses group by stu_id;
就会得出完整结果,如下:
图片说明
问题:
请问各位大佬,这是什么原因,为什么必须要加上这个max()结果才会完整,请帮我解解惑。。。

3个回答

我大致看了下 你应该是没看出来你自己写进去了2个历史学么 既然是两个历史学 后面跟group by 根据stu_id
分类 那么 怎么分 2个两百 系统识别不出来 加了max 也是筛选出最大的那个 class id 从语法上你每错 但是逻辑是错的

yy339452689
一个砖猿 请问哪里有写进去2个历史学额?我后面有case when判断的,结果集里面怎么会有两个历史学呢。这一点你说的我不太理解。然后这个表只是随便建立的,用来写sql练习的,确实不规范。
接近 2 年之前 回复

还有大兄弟 任何一个数据库表 最好创建一个主键 你这个我感觉是sql server把 自己要养成习惯创建一个主键

likui19921224
伏辄 回复一个砖猿: 你错了 max min sum 都是运算使用的 简单点说 :group 是分组使用的 如果不分组 前面就会根据数据选出最大的/最小的 如果分组 那么就会根据你分的组分别选出最大的 两者的区别 前者一个 后者是多条数据
接近 2 年之前 回复
yy339452689
一个砖猿 今天再次测试,发现并不是max的问题。如果把max换乘其他的聚合函数如min(),sum()是都可以显示出来的。但至于这里的这个聚合函数的作用,还是不太清楚
接近 2 年之前 回复

经过几番琢磨,我发现了我所遇到的问题根本之所在。
首先,标题及提问方面,对于这个max的误导我先说声不好意思。其实跟这个max没太大关系。
再说说问题,至于这个为什么加上max能显示第二条数据的classid,不加则不会显示,其实这跟数据的排序顺序有点一点关系。就是如果我们把表中的stu_id为200的第一条数据历史学改成主修课Y,那么这个查询的结果集也不会出现null值。当然,这不是关键。
关键是语句逻辑问题。这个查询语句因为本身就是查询了两个条件的结果集,那么我们得分开来看这个问题。
第一点:第一句case when 这是查询只选修了一门课程的同学,即stu_id为300,400,500的同学,对应的class_id为4,5,6;
第二点:else后面接的则是选修了多门课程的数据,也是按stu_id分组查出来的。那么此时在这个多门课程的分组中再使用case when else时,他显示出来的第一条结果肯定是满足条件的第一条数据,至于为什么第二条的200后面为null是因为第二个case when 语句后面的else条件为null,如果你改成其他的,则会显示别的。那么用聚合函数来包含这个结果集时,有结果的数据应该是优先于为null值的查询结果的。所以我们加上聚合函数,会得到我们想要的结果。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
MAX用法?
我rn$sql="select max(id) from table";rn$con->query($sql);rnrnwhile($con->next_record())rnrn $c=$con->f("id");rnrnecho $c;rnrn我想求出库里 id 的最大值 用以上的写法 求不出 什么也不显示。请问高手应该如何写?
max用法...
[code=SQL]rnselect 姓名 ,rn max(case 课程 when '语文' then 分数 else 0 end) 语文,rn max(case 课程 when '数学' then 分数 else 0 end) 数学,rn max(case 课程 when '物理' then 分数 else 0 end) 物理rnfrom tbrngroup by 姓名rnrn[/code]rn这里的max不是很理解...
浮点数运算不解之谜?
浮点数运算时,系统会产生误差,如下:rnrndouble oo = 19.6D;rndouble pp = oo * 100D;rnrnpp期望结果:1960.0rnpp实际结果:1960.00000000002rnrn为什么,怎么解决,实在不解!rn要知道,在对数值精度和正确性要求非常高的系统里,这可能是致命的错误啊!
不解之谜请教
我要在dotnet.vb中打开的一个word文件,想用一个“引用”rn在Vb.net中我一直没找到,请问是不是换了别的
C#表格控件 dataGrid1 不解之谜!
想请教一下我的 dataGrid1 表格控件内为何没有 DataBind() 属性,却有 DataBindings 属性。rnrn(一)出现象这样: dataGrid1.DataBindings ; rn(二)而不是这样: dataGrid1.DataBind(); rnrn按F5运行后(二)后,就出现这样的出错信息:“只有 assignment、call、increment、decrement 和 new 对象表达式可用作语句”。rn
sql中max与min的用法请教!
sql语句为:rnsql="select min(tt_min),max(tt_max) from tb_58424 where date_time <= #"&mt&"# and date_time >= #"&mt&"# "rn其中tt_min,tt_max,date_time为字段名,mt、fmt为两个时间值,tt_max、tt_min中有正负值,这样读出好象不分正负了rn请给我正确的方法,谢谢!!!rn
matlab中max的用法
matlab中max的用法
请教关于max的用法
1.运行:rnselect e.empno, row_number() over(order by empno) from emp e fetch first 15 rows onlyrn显示最大的empno应为:000160rn2.但运行以下语句:rnselect max(tt.empno) from ( select e.empno, row_number() over(order by empno) from emp e fetch first 15 rows only ) as ttrn结果却为:200340,这应该是整张表里最大的,而不是前面15条记录中最大的。rn为什么?rn
PHP max函数的用法
Max函数的用法 定义和用法 max() 返回一个数组中的最大值,或者几个指定值的最大值 语法 max(array_values); or max(value1,value2,...); 参数 描述 array_values 必需。规定一个包含值的数组 values1,values2,… 必需。规定要比较的值(至少两个值) &lt;?php echo max(1...
求助max用法
table :rntable1rnut_id hn_id srt_id tky_dte_id start_date rn 003 01 1 20040101 20040909rn 003 01 1 20040109 20041209rn 004 01 1 20040101 20041101rnrn现在有如下语句rnselect ut_id,max(tky_dte_id) from table1 where hn_id = 01,srt_id = 1 group by ut_idrn ut_id tky_dte_id rn 003 20040109rn 004 20040101rnrnrnselect ut_id,start_date,max(tky_dte_id) rnfrom table1 rnwhere hn_id = 01,srt_id = 1rngroup by ut_id,start_daternrn却有三条记录 rn可是我又想取得 start_date和 ut_id的值rn请教 这个语句 该如何写才能 返却ut_id,start_date, 并取得 tky_dte_id的最大值
求聚合函数MAX用法??
有个表ta(A,B,C)rnrn假设数据如下rnrnA B Crn1 x 10rn1 y 100rn1 h 30rn6 c 80rn6 z 50rnrn要把字段A中相同的并且字段C中最大的值检索出来语句该怎么写rnrn上面的结果应该是:rnrnA B Crn1 y 100rn6 c 80rnrnrn
问一种max的用法
某一个字段的值,是比较两个表达式的值,选其中最大的赋值rn不想用case when,if判断什么的rnrn有没有内置的函数,比如max(exp1, exp2...)之类的,可以返回给定表达式中最大的值?
max与min 函数的用法
程序里用了max和min函数,但程序运行错误rn提示:error C2065: 'min' : undeclared identifierrn   error C2065: 'min' : undeclared identifierrn用这两个函数是不是还要加入什么头文件啊
血与荣耀(第二章-不解之谜)
阳光从圣光明教堂的天窗里洒进来,轻风吹过宏伟的大厅,卷起一阵细尘。白色的大蜡烛整齐的排列在教堂巨大的彩色窗户前,窗户前是一幅自豪的帝王般的战士画像。数以千计的彩色玻璃碎片点缀着他宽阔的面容和贵族般的气质,他全身被金色的光辉包围,一手拿着巨大的战锤,一手捧着一本皮面的书。书的标题清晰可见 “Esarus thar no’Darador”——以鲜血捍卫荣耀。 提里奥•弗丁望着这彩色的画像不禁心驰神往...
微软控件backgroundwork 的不解之谜
大家都知道微软控件中有个位了方便新手的后台线程控件。最近在使用这个控件的时候我发现了一个很是无解的问题。rn我在项目中拖拽了一个控件到项目中。当调用控件的RunWorkerAsync()方法之后,这个时候会立即执行控件的dowork方法。但是用了一段时间。现在发现,当调用RunWorkerAsync()方法之后,很长时间才会进入dowork方法了。真不知道这个原因是什么!!!开始运行程序的时候调用RunWorkerAsync()方法之后等个大概20-60秒才进入dowork方法。要是在运行中。在控件的RunWorkerCompleted方法中再次调用RunWorkerAsync()方法,我甚至等了6分钟才执行dowork方法。不知道哪位朋友遇见过这个问题没有呢?难道这个是控件的什么bug?
.net 不解之谜! Csharp
.net里有这样一个类Processrn 实例化后可以访问其属性rn Process.TotalProcessorTimern 得到一个timespan类型的值rn 这个是“获取此进程的总的处理器时间。”(msdn上是这样写的)rn 问题出现了:请仔细想!rn [color=#FF0000] 如果我们的计算机是双核或更多核·····rn 那么这个属性取出来的值 是相对于单纯的计算机时间的 rn 还是计算机时间乘以cpu核心数(或是线程数)rn 或者存在更加复杂的对应关系[/color]rnrn 谢谢您的查看!不要鄙视我是标题党,呵呵。rn 既然来了 就帮帮我吧 ! 我也很困惑。。。。
求教max()和GROUP BY的详细用法!
才着手用access做统计,不太明白这两个语句的用法。请多指教,最好能详细点,那有SQL详细的语法之类的书下载啊,上次下了一个不全。只有一部份
max函数和min 函数的用法
今天写代码的时候用到了max函数和min函数,查了帮助文档,并将其内容记录在此。 max函数 用于求数组中的最大元素。暂时用到的语法形式有以下3种: C = max(A); C = max(A, B); C = max(A, [], dim); 描述: C = max(A)返回数组不同维度的最大元素。如果A是一个向量,max(A)返回向量A中的最大元素;如果A是一个矩阵,max(...
max和min函数的高级用法
&amp;gt;&amp;gt;&amp;gt; dic = {&quot;age1&quot;:18,&quot;age2&quot;:25,&quot;age33&quot;:5,&quot;age48&quot;:852,&quot;agesds&quot;:556} &amp;gt;&amp;gt;&amp;gt; max(zip(dic.keys(),dic.values())) ('agesds', 556) &amp;gt;&amp;gt;&amp;gt; max(zip(dic.values
in、len、max、min、ord用法
1、in用法 in是判断某个数据是否在某个数据库中,返回类型是bool类型 not in是判断某个数据不在某个数据库中,返回类型是bool类型 #判断3是不是在列表中 &amp;gt;&amp;gt;&amp;gt;3 in [1,2,3,4,5] &amp;gt;&amp;gt;&amp;gt;True #判断10不在列表中 &amp;gt;&amp;gt;&amp;gt;10 not in [1,2,3,4,5] &amp;gt;&amp;gt;&amp;gt;Tru...
关于max函数的用法,谢谢
有个表,名字是Product,其中有一个字段是id,int类型,是标识,标识增量是1,象access里的自动编号。那个表有一个索引,索引类型:聚集;唯一;按升序排列。rn这个表里有些数据,id字段对应的值分别是35、36、37、38、39、40、41。rnrn我想查前4条记录(top 4)的id字段的最大值,也就是我想获得38这个id号,但怎么查都是查得到41这个id号。rnrn我用的是以下这条命令rnselect max(id) from (select top 4 id from Product) as TempTablernrn请问为什么查不到我想要的38?应该怎么改?
java的max和min的用法求教
[code=java]rn import java.lang.Math;rn double[] rec1 = new double[4];rn double[] rec2 = new double[4];rn double[] rec3 = new double[4];rn ..........省略.......rn rec3[3]=min(max(rec1[1],rec1[3]),max(rec2[1],rec3[3]));rn rec3[4]=min(max(rec1[2],rec3[4]),max(rec2[2],rec2[4]));rn rec3[1]=max(min(rec1[1],rec1[3]),min(rec2[1],rec2[3]));rn rec3[2]=max(min(rec1[2],rec1[4]),min(rec2[2],rec2[4]));rn[/code]rnrnrnrn然后提示错误rnH:\Java>javac recMul.javarnrecMul.java:16: 错误: 找不到符号rn rec3[3]=min(max(rec1[1],rec1[3]),max(rec2[1],rec3[3]));rn ^rn 符号: 方法 max(double,double)rn 位置: 类 recMulrnrecMul.java:16: 错误: 找不到符号rn rec3[3]=min(max(rec1[1],rec1[3]),max(rec2[1],rec3[3]));rn ^rn 符号: 方法 max(double,double)rn 位置: 类 recMulrnrecMul.java:17: 错误: 找不到符号rn rec3[4]=min(max(rec1[2],rec3[4]),max(rec2[2],rec2[4]));rn ^rn 符号: 方法 max(double,double)rn 位置: 类 recMulrnrecMul.java:17: 错误: 找不到符号rn rec3[4]=min(max(rec1[2],rec3[4]),max(rec2[2],rec2[4]));rn ^rn 符号: 方法 max(double,double)rn 位置: 类 recMulrnrecMul.java:18: 错误: 找不到符号rn rec3[1]=max(min(rec1[1],rec1[3]),min(rec2[1],rec2[3]));rn ^rn 符号: 方法 min(double,double)rn 位置: 类 recMulrnrecMul.java:18: 错误: 找不到符号rn rec3[1]=max(min(rec1[1],rec1[3]),min(rec2[1],rec2[3]));rn ^rn 符号: 方法 min(double,double)rn 位置: 类 recMulrnrecMul.java:19: 错误: 找不到符号rn rec3[2]=max(min(rec1[2],rec1[4]),min(rec2[2],rec2[4]));rn ^rn 符号: 方法 min(double,double)rn 位置: 类 recMulrnrecMul.java:19: 错误: 找不到符号rn rec3[2]=max(min(rec1[2],rec1[4]),min(rec2[2],rec2[4]));rn ^rn 符号: 方法 min(double,double)rn 位置: 类 recMulrn8 个错误rnrnrn这是为什么呢,新手在线等。。不能这么嵌套写吗?
新手请教max的具体用法
谢谢了
Python内置函数max()高级用法
不管是排序还是选取最大值或者最小值,都应该有个规则或者顺序,而平时我们所说的最大值或最小值实际上也是在某种排序规则或顺序下的最大值和最小值。Python内置函数max()、min()和sorted()以及列表方法sort()都有一个参数key用来指定排序规则,解决的就是这个问题。key参数应该是一个可调用对象,在Python中,类、自定义函数、内置函数、lambda表达式、带有特殊方法__call
在MAX中筛选MAX,求好的SQL语句
id AreaNo AreaName ProvinceID PostCode ZoneCode Area AreaLevel AddWho AddDatern73 999999 北京直辖市 9 华北 一级市 13 2010-10-22 00:00:00.000rn74 110100 北京市 8 华北 一级市 13 2010-10-22 00:00:00.000rn75 110101 东城区 8 华北 NULL 13 2010-10-22 00:00:00.000rn76 110102 西城区 9 华北 NULL 13 2010-10-22 00:00:00.000rn76 110102 西城区 9 华北 NULL 14 2010-10-22 00:00:00.000rn……rnrn筛选出AddWho = 13 的ProvinceID最大的ID最小行?
求sql conut(max)
表:wps_systemtj rn字段:sys_id, sys_userDiQu, sys_version rn 2 11 7.1.7.17rn 3 11 7.1.7.17rn 4 31 7.1.6.16rn 5 31 6.1.6.16rn 6 11 7.1.6.16rnrn怎么实现这个查询:rnselect sys_userDiQu ,count(max(sys_version))from wps_systemtj group by sys_userDiQu (现在有问题。)rn
sql max 问题
mysql 表usercount数据rnuserID count publicDatern49 101 2014-5-6rn50 103 2014-5-9rn50 108 2014-6-3rnrn[size=14px]CREATE OR REPLACE VIEW usercount_view AS rnSELECT userID,count,MAX(publicDate) FROM usercount GROUP BY userID;[/size]rnrn本想要的是这个结果rn49 101 2014-5-6rn50 108 2014-6-3rn但却是这个结果rn49 101 2014-5-6rn50 103 2014-6-3rn请高手帮忙修改一下SQL语句,叩谢!!!
关于sql max()的疑问
我用command打开accsee的参数查询,语句如下:然后把返回值赋给rscoverrnselect max(记录号)rnfrom coverrnwhere 档案号 like ”[档案号]%“rnrnrn用rscover.bof and rscoer.eof 判断总为假,返回的都是一条记录,怎么判断他返回的是空记录呢?rnrn
sql中的MAX查询
表1如下VALUE,NAME两值,VALUE为DOUBLE类型,NAME为CSTRING类型,NAME中有很多个,现只求NAME为J1,J2,J3,J4中的VALUE的最大值,该怎么用MAX来连接SQL求?语句怎么写啊?
sql语句的max()的问题
shop表有商品名称rndetail表有流水号,商品名称等等rn 001 糖果 rn 002 棉花糖rn 003 糖果 rnrnrn并且shop.商品名称=detail.商品名称rn如何求shop.商品名称=糖果时,detail的max(流水号)的糖果的所有信息
简单sql 求max
这样的数据rn JYUCYUU_NO JYUCYUU_MEISAI GENKA_MEISAI .... .......rnP04100029781 1 0 aaaa gggrnP04100029781 1 2 rnP04100029781 1 3 fff ffrnP04100029781 1 4 rnP04100029781 1 5 ggg ddrnP04100029781 1 6 rnP04100029781 1 7 .... ..rnP04100029781 1 8 rnP04100029781 1 9 rnP04100029781 1 10 rnrnrnrnrn写这个sql , 想要求出 GENKA_MEISAI的最大值rnrnSELECT rn max(GENKA_MEISAI)rnFROM rn URIGEN_TBLrnWHERE rn JYUCYUU_NO = 'P04100029781' andrn JYUCYUU_MEISAI = '1' rnrnrn结果是 ---〉 9rn rn怎么回事?rnrn菜鸟提问,请多指教
MAX与GROUP的SQL语句
现有一张表,查询材料的价格.卖家与材料是多对多的关系.rn其中有两个时间列,价格列,汇率列.rn先考虑A时间,如果最新,就最新时间对应的材料.rn如果不同卖家的A时间相同,再考虑B时间,如果B时间再相同,再考虑价格.rn同时要带出汇率的名称以便后面进行汇率转换.rnrn这样的SQL如何写?rn
SQL MAX的使用
我有一个表,主要的的结构是rnrnrnstation card time flag rn257 111 2009-10-01 08:00:00 1rn257 111 2009-10-01 08:00:10 0rn258 111 2009-10-01 08:00:20 1rn259 111 2009-10-01 08:00:30 1rn259 111 2009-10-01 08:00:40 0rn257 222 2009-10-01 08:00:00 1rn257 222 2009-10-01 08:00:10 0rn258 222 2009-10-01 08:00:20 1rn259 222 2009-10-01 08:00:30 1rn260 222 2009-10-01 08:00:40 1rnrn我希望得到的结果是每个card 最后一个时间记录 max(time) and flag = 1的记录rn也就是希望最后的结果是rn259 111 2009-10-01 08:00:30 1rn260 222 2009-10-01 08:00:40 1rn我该如何写呢?
SQL求MAX??
sql="select max(topic_id) as topicid from user_topic"; rnsql="select max(topic_id) from user_topic"; rn怎么取结果??
sql基本用法sql基本用法sql基本用法
sql基本用法sql基本用法sql基本用法sql基本用法sql基本用法sql基本用法
max=(a>b)?a:b;用法困惑
我想用max=(a>b)?a:b; 操作符实现变量count从0自增到500,再从500自减到0循环下去,程序哪里出现问题了为什么输出总是6487628[img=https://img-bbs.csdn.net/upload/201711/17/1510911646_153952.png][/img][code=c]#includernmain()rnrn int count=0;rn while(count<=500)rn rn count=((count++)>(count))?count++:count;rn printf("%d\n",&count);rn while(count==500)rn rn while(count>=0)rn rn count=((count--)<(count))?count--:count;rn printf("%d\n",&count);rn rn rn rn[/code]
【20190612】【Matlab】max() 函数的用法详解
[a, p] = max(sigmoid(X * all_theta'), [], 2); 多元逻辑回归代码中遇见了这样一行,我的疑问是:为什么 max() 中要加一个 ‘[]’ ? max用法的几种形式: max(a); max(a, b); max(a, [], dim); [C, I] = max(a); [C, I] = max(a, [], dim); 区分...
关于sql--count avg sum min max的用法
如题`~~~~~~~rn 烦死我。在网上找了N种。可都看不明。那个能人,来讲解讲解!!
python中max函数的用法解析
python中 max函数可以输入一个参数,也可以输入两个参数。如果是一个参数,这个参数必须是可迭代的,max会for i in … 遍历一遍这个迭代器函数会返回其最大值,也可以给出key参数,这样函数会把第一个参数的每个值依次放入key提供的比较大小的方法里(常常是一个函数)求出最大值.下面这个例子很好地反映了key的作用:list=[1,2,5,9,4,6,3] &amp;gt;&amp;gt;&amp;gt; ma...
关于Matlab中Max函数的用法
Max函数的集中常用使用方法: M = max(A);  %返回A中的最大元素值; M = max(A, [], dim);%返回指定维的最大值,1- 行,2-列,依次类推多为数组; [M, I] = max(_);%M为元素之, I为所对应的Index C = max(A, B);%返回一个数组C,分别从A和B中取最大值。 可以由此类推相似的几个函数,Min等。       ...
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池