sql IIF函數的應用


工作中由於用各種框架,業務也不是很復雜,一直沒怎么寫過復雜的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 = 0 To UBound(headArr) Cells(1, i + 1) = headArr(i) Next Cells(2, 2).CopyFromRecordset rs rs.Close: Set rs = Nothing Con.Close: Set Con = Nothing End Sub

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM