ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 182|回复: 5

怎么改sql语句

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-5 13:52 | 显示全部楼层 |阅读模式
现有一张成绩表,要求计算每个班  每学科的有效分人数?

具体要求见附件?

成绩.7z

51.52 KB, 下载次数: 8

TA的精华主题

TA的得分主题

发表于 2024-5-5 14:47 | 显示全部楼层
...............

成绩.zip

54.11 KB, 下载次数: 6

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-5 14:58 | 显示全部楼层
  1. Option Explicit

  2. Sub test0()
  3.   Dim ar, Conn As Object, rs As Object, i As Long
  4.   Dim strSQL As String, SQL As String, strConn As String
  5.   Dim tab_ As String, class_ As String, pivot_ As String
  6.   
  7.   Set Conn = CreateObject("ADODB.Connection")
  8.   If Application.Version < 12 Then
  9.     strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source="
  10.   Else
  11.     strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source="
  12.   End If
  13.   Conn.Open strConn & ThisWorkbook.FullName
  14.   
  15.   With Sheet1
  16.     tab_ = .Name & "$" & .Range("A1").CurrentRegion.Address(0, 0)
  17.     class_ = .Range("A1").Value
  18.     ar = .Range("M1").CurrentRegion.Resize(2).Value
  19.   End With
  20.   
  21.   SQL = "SELECT " & class_ & ",'-ar(1,i)' AS 科目 ,-ar(1,i) AS 成绩 FROM [" & tab_ & "] WHERE -ar(1,i)>=-ar(2,i)"
  22.   For i = 2 To UBound(ar, 2)
  23.     strSQL = strSQL & " UNION ALL " & Replace(Replace(SQL, "-ar(1,i)", ar(1, i)), "-ar(2,i)", ar(2, i))
  24.     pivot_ = pivot_ & ",'" & ar(1, i) & "'"
  25.   Next
  26.   strSQL = Mid(strSQL, 12) & Replace(strSQL, class_, "'总计'")
  27.   
  28.   strSQL = "TRANSFORM COUNT(成绩) SELECT " & class_ & " FROM (" & strSQL & ") GROUP BY " & class_ & " PIVOT 科目 IN (" & Mid(pivot_, 2) & ")"
  29.   Set rs = Conn.Execute(strSQL)
  30.   
  31.   With Sheet1.Range("M1")
  32.     .CurrentRegion.Offset(2).ClearContents
  33.     For i = 0 To rs.Fields.Count - 1
  34.       .Offset(, i) = rs.Fields(i).Name
  35.     Next
  36.     .Offset(2).CopyFromRecordset rs
  37.   End With
  38.   
  39.   rs.Close
  40.   Set rs = Nothing
  41.   Conn.Close
  42.   Set Conn = Nothing
  43.   Beep
  44. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-5 15:13 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
关键字:union all
GIF 2024-05-05 15-11-39.gif

成绩.zip

55.04 KB, 下载次数: 4

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-5-5 15:15 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Sub limonet()
    Dim Cn As Object, StrSQL$, Arr As Variant
    Set Cn = CreateObject("Adodb.Connection")
    Cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
    Arr = Range("N1:U2")
    For i = 1 To UBound(Arr, 2)
        StrSQL = StrSQL & " Union All Select 班级,'" & Arr(1, i) & "' as 科目,Count(*) as 计数 From [理科$A:J] Where " & Arr(1, i) & ">=" & Arr(2, i) & " Group By 班级" _
        & " Union All Select '总计','" & Arr(1, i) & "' as 科目,Sum(计数) as 计数 From (Select 班级,'" & Arr(1, i) & "' as 科目,Count(*) as 计数 From [理科$A:J] Where " & Arr(1, i) & ">=" & Arr(2, i) & " Group By 班级)"
    Next i
    StrSQL = "TransForm Sum(计数) Select 班级 From (" & Mid(StrSQL, 12) & ") Group By 班级 Pivot 科目 In('语文','英语','数学','物理','化学','生物','理综','总分')"
    Range("M14").CopyFromRecordset Cn.Execute(StrSQL)
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-5-5 16:00 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-19 01:46 , Processed in 0.053317 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表