工作中由于用各种框架,业务也不是很复杂,一直没怎么写过复杂的sql,今天写了一个

数据如下

代码如下

Sub 班级分数等级分析(shname)

    Dim Con As Object, rs As Object
Dim sql As String, sql2 As String, sh As String
Dim headArr headArr = Array("序号", "班级", "班主任", "任教老师", "最高分", "最低分", "平均分", "平均分名次", "A", "A率", "B", "B率", "C", "C率", "D", "D率", "E", "E率", "参考率", "T", "质量指数名次") Set Con = CreateObject("ADODB.Connection") Con.Open "Provider=Microsoft.Ace.OLEDB.12.0;Extended Properties='Excel 12.0;hdr=no;imex=1';Data Source=" & ActiveWorkbook.FullName sh = "[" & ActiveSheet.Name & "$]"

这个是分析统计参考的人,参考的学生成绩分 A B C D E 五个等级,一开始不知道要怎么对每个等级分别统计,因为是在同一个字段里
后来发现可以用IIF函数来判断是否是哪个等级的,再用sum做个数统计,这里用IFF是因为这里不支持case when,case when 和 IIF要根据不同的数据库来选择使用
c8是统计参考的全部人数
sql = " SELECT f1, f2, f3, max(f10), min(f10), avg(f10) as f6, count(f8) as c8,"
sql = sql + " sum(IIF(trim(f8)='A',1,0)) as A, A/c8 as AA, "
sql = sql + " sum(IIF(trim(f8)='B',1,0)) as B, B/c8 as BB, "
sql = sql + " sum(IIF(trim(f8)='C',1,0)) as C, C/c8 as CC, "
sql = sql + " sum(IIF(trim(f8)='D',1,0)) as D, D/c8 as DD, "
sql = sql + " sum(IIF(trim(f8)='E',1,0)) as E, E/c8 as EE "
sql = sql + " from " & sh & " where f10 >= 0 group by f1,f2,f3 "

这个是为了查找出每个班级对应的所有人,包括缺考的
红色三个字段是为了左连接用的
cc8是统计班级的全部人数
sql2 = "select f1,f2,f3,count(f8) as cc8 from " & sh & " group by f1,f2,f3"

这个呢是把两个查询结果,作为两个表,左连接查询   sql = " select a.*, c8/cc8, (c8/cc8)*((AA+BB)*30+(AA+BB+CC+DD)*60+EE*10) from (" & sql & ") a left join (" & sql2 & ") b on a.f1 = b.f1 and a.f2 = b.f2 and a.f3 = b.f3 order by f6 desc " Set rs = Con.Execute(sql) Call 删除已经存在的表(shname)
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = shname For i = To UBound(headArr)
Cells(, i + ) = headArr(i)
Next Cells(, ).CopyFromRecordset rs rs.Close: Set rs = Nothing
Con.Close: Set Con = Nothing End Sub

sql IIF函数的应用的更多相关文章

  1. 楼梯T-SQL:超越基础6级:使用CASE表达式和IIF函数

     从他的楼梯到T-SQL DML,Gregory Larsen涵盖了更多的高级方面的T-SQL语言,如子查询. 有时您需要编写一个可以根据另一个表达式的评估返回不同的TSQL表达式的单个TSQL语句. ...

  2. t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数

    t-sql的楼梯:超越基本级别6:使用案例表达式和IIF函数 源自:Stairway to T-SQL: Beyond The Basics Level 6: Using the CASE Expre ...

  3. sql 判断 函数 存储过程是否存在的方法

    下面为您介绍sql下用了判断各种资源是否存在的代码,需要的朋友可以参考下,希望对您学习sql的函数及数据库能够有所帮助.库是否存在if exists(select * from master..sys ...

  4. DB2 SQL 日期函数

    DB2 SQL 日期函数1:CURRENT TIMESTAMP 函数:获取当前日期时间语法:CURRENT TIMESTAMP参数:当前日期时间返回值:当前日期时间 2:CURRENT DATE 函数 ...

  5. Netsuite Formula > Oracle函数列表速查(PL/SQL单行函数和组函数详解).txt

    PL/SQL单行函数和组函数详解 函数是一种有零个或多个参数并且有一个返回值的程序.在SQL中Oracle内建了一系列函数,这些函数都可被称为SQL或PL/SQL语句,函数主要分为两大类: 单行函数 ...

  6. SQL 聚合函数

    SQL聚合函数 MAX---最大值 MIN--最小值 AVG--平均值 SUM--求和 COUNT--记录的条数 EXample: --从MyStudent表中查询最大年龄,最小年龄,平均年龄,年龄的 ...

  7. SQL表值函数和标量值函数的区别

    SQL表值函数和标量值函数的区别 写sql存储过程经常需要调用一些函数来使处理过程更加合理,也可以使函数复用性更强,不过在写sql函数的时候可能会发现,有些函数是在表值函数下写的有些是在标量值下写的, ...

  8. ylb:SQL 常用函数

    ylbtech-SQL Server: SQL Server-SQL 常用函数 1,数学函数 2,日期和时间函数 3,字符串函数 4,转换函数 1,ylb:SQL 常用函数返回顶部 1,数学函数 2, ...

  9. SQL自定义函数split分隔字符串

    SQL自定义函数split分隔字符串 一.F_Split:分割字符串拆分为数据表 Create FUNCTION [dbo].[F_Split] ( @SplitString nvarchar(max ...

随机推荐

  1. 基于MFC的一个简单计算器

    写一个简单的计算器并不是什么很难的事,主要目的是要通过这个程序来学习和分析其中的核心算法.这个简易计算器的核心部分就是对输入的表达式的正确性判断与求值,其中包括对表达式的解析.中缀表达式转后缀表达式. ...

  2. 32位win7系统下配置IIS遇到php-cgi.exe - FastCGI 进程意外退出问题的解决的方法

    今天重装了一下系统,是32位的WIN7.装完系统后想把IIS装回来,由于有时候须要用到笔记本处理一些事情.结果WEBserver正常了.但IIS的FASTCGI模块始终不能解析PHP,一直报php-c ...

  3. MySQL Study之--MySQL压力測试工具mysqlslap

    MySQL Study之--MySQL压力測试工具mysqlslap 一.Mysqlslap介绍     mysqlslap是MySQL5.1之后自带的benchmark基准測试工具,类似Apache ...

  4. LiveWriter高亮显示方法专题

    2013年9月26日 花了一上午的时间,熟悉了LiveWriter的用法,学会了怎么配置语法高亮,总结下来.   方法1.用博客园推荐的方法没有成功.pass   方法2 方法来自一个人的旅行.试过O ...

  5. leetcode 690. Employee Importance——本质上就是tree的DFS和BFS

    You are given a data structure of employee information, which includes the employee's unique id, his ...

  6. java获取本周 上周的所有日期

    1 根据当前日期获得所在周的日期区间(周一和周日日期) public String getTimeInterval(Date date) { Calendar cal = Calendar.getIn ...

  7. 如何在Java生态圈选择一个轻量级的RESTful框架?

    在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元.微服务 ...

  8. bzoj 1426: 收集邮票【期望dp】

    我太菜了,看的hzwer的blog才懂 大概是设f[i]表示已经拥有了i张邮票后期望还要买的邮票数,这个转移比较简单是f[i]=f[i]*(i/n)+f[i+1]*((n-i)/n)+1 然后设g[i ...

  9. js获取标签的三种方式

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. JavaScript编程艺术-第7章代码汇总(2)

    [7.4节] 重回“JavaScript美术馆”代码 ***亲测可用*** HTML: JS: