工作中由于用各种框架,业务也不是很复杂,一直没怎么写过复杂的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. .net mvc4 + ajaxfileupload.js 解决IE浏览器中弹出下载对话框问题

    摘要:每一个人遇到的问题都不一样,在网上找了一大圈都没有解决到我的问题!由于我的环境如标题所看到的.攻克了这个问题. 主要问题:在于响应头的设置 Controller: [HttpPost] publ ...

  2. Thinking in Java---多线程仿真:银行出纳员仿真+饭店仿真+汽车装配工厂仿真

    多线程一个非常有意思的作用就是用于仿真,这篇博客就会结合几个仿真实例来综合运用一下前面所学的多线程并发知识. 一.银行出纳员仿真 问题描写叙述:银行会有非常多来办业务的顾客,他们会排队等待服务:对于银 ...

  3. 动态JSP的了解

    一.JSP与HTML的根本区别 1..JSP(Java Server Page)页面是动态页,JSP页面是有JSP容器执行该页面的Java代码部分然后实时生成的HTML页面,因而说是动态页面.2..H ...

  4. Jenkins CLI 使用

    //链接java -jar jenkins-cli.jar -s JenkinsHost who-am-i --username 用户名 --password 密码 删除Jobjava -jar je ...

  5. beego1---beego,bee环境配置

    1.配置环境变量GOPATH(代码路径,先在里面建立src,pkg,bin3个目录),GOROOT:go安装的目录,go安装目录下的bin目录放到Path环境变量. 安装完bee工具之后,bee 可执 ...

  6. Application Warm-up Module IIS7.5 也有Warm Up功能,让ASP.NET 第一次Request不变慢

    Application Warm-up Module: 應用程式的暖機代理人 http://www.microsoft.com/taiwan/technet/iis/expand/Applicatio ...

  7. ubuntu将mysql、nginx添加到环境变量中

    vim /etc/profile 添加 export PATH="$PATH:/usr/local/mysql/bin" export PATH="$PATH:/usr/ ...

  8. mybatis写当天 当月的数据 时间段数据

    1 数据库字段pk_time(Varchar) 当天的数据 SELECT * FROM 表 WHERE date(fk_time) = curdate(); 当月的数据 SELECT *FROM 表 ...

  9. bzoj3295 洛谷P3157、1393 动态逆序对——树套树

    题目:bzoj3295 https://www.lydsy.com/JudgeOnline/problem.php?id=3295 洛谷 P3157(同一道题) https://www.luogu.o ...

  10. 830C

    分块+二分 这道题思路很巧妙 我们大概可以推出一个式子sigma(d-[(ai-1)%d+1])<=k,要求求出d的最大值 然后我们化简一下,sigma(d-[(ai-1)-[(ai-1)/d] ...