以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  iif函数用Case When语句代替的问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=79492)

--  作者:myredsun
--  发布时间:2016/1/3 11:11:00
--  iif函数用Case When语句代替的问题
Dim b As New SQLGroupTableBuilder("统计表1","学生成绩")
b
.Groups.AddDef("科目")
b
.Totals.AddDef("分数",AggregateEnum.Max,"最高分")
b
.Totals.AddDef("分数",AggregateEnum.Min,"最低分")
b
.Totals.AddDef("分数",AggregateEnum.Average,"平均分")
b
.Totals.AddExp("分布_60以下","iif(分数 < 60,1,0)")

b
.Totals.AddExp("分布_60-70","iif(分数 >= 60 And 分数 < 70,1,0)")

请问老师:最后那句如何用case when 语句转换。在帮助中我转了几次都不行。有劳了。

--  作者:myredsun
--  发布时间:2016/1/3 20:30:00
--  

示例一

假定有下图所示的成绩表:

图片点击可在新窗口打开查看

我们需要统计每一个科目的成绩分布范围,例如60分以下,60分以上,70分以上等等范围的人数,以及各个科目的最高分、最低分、平均分等:

图片点击可在新窗口打开查看

采用自定义表达式,可以方便地统计出来:

Dim b As New SQLGroupTableBuilder("统计表1","学生成绩")
b
.Groups.AddDef("科目")
b
.Totals.AddDef("分数",AggregateEnum.Max,"最高分")
b
.Totals.AddDef("分数",AggregateEnum.Min,"最低分")
b
.Totals.AddDef("分数",AggregateEnum.Average,"平均分")
b
.Totals.AddExp("分布_60以下","iif(分数 < 60,1,0)")
b
.Totals.AddExp("分布_60-70","iif(分数 >= 60 And 分数 < 70,1,0)")
b
.Totals.AddExp("分布_70-80","iif(分数 >= 70 And 分数 < 80,1,0)")
b
.Totals.AddExp("分布_80-90","iif(分数 >= 80 And 分数 < 90,1,0)")
b
.Totals.AddExp("分布_90-100","iif(分数 >= 90 And 分数 < 100,1,0)")
b
.Totals.AddExp("分布_100-110","iif(分数 >= 100 And 分数 < 110,1,0)")
b
.Totals.AddExp("分布_110-120","iif(分数 >= 110 And 分数 < 120,1,0)")
b
.Totals.AddExp("分布_120-130","iif(分数 >= 120 And 分数 < 130,1,0)")
b
.Totals.AddExp("分布_130-140","iif(分数 >= 130 And 分数 < 140,1,0)")
b
.Totals.AddExp("分布_140以上","iif(分数 >= 140,1,0)")
b
.build()
MainTable
 = Tables("统计表1")


SQL Server没有iif函数,需要用Case When语句代替。


请教:如何代替?有劳各位了


--  作者:大红袍
--  发布时间:2016/1/3 21:16:00
--  

比如

 

b.Totals.AddExp("分布_60-70","(case when 分数>=60 and 分数<70 then 1 Else 0)")


--  作者:myredsun
--  发布时间:2016/1/3 22:57:00
--  
Dim b As New  SQLGroupTableBuilder("统计表1","成绩表")
b.C
 b.Groups.AddDef("科目")
 b.Totals.AddDef("分数",AggregateEnum.Max,"最高分")
 b.Totals.AddDef("分数",AggregateEnum.Min,"最低分")
 b.Totals.AddDef("分数",AggregateEnum.Average,"平均分")
 b.Totals.AddExp("分布_60-70","(case when 分数 >= 60 And 分数 < 70 then 1 else 0)")
  b.build()
 MainTable = Tables("统计表1")

执行发生错误,先谢了。再有劳各位

--  作者:客人
--  发布时间:2016/1/3 23:02:00
--  
b.Totals.AddExp("分布_60-70","(case when 分数>=60 and 分数<70 then 1 Else 0 end)")_____后面加上end就行了。太谢谢你了!
--  作者:大红袍
--  发布时间:2016/1/3 23:42:00
--  
 哦,是的,少写了End