ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: mps777

[原创] 用SQl来做学生成绩分析

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2013-5-2 11:02 | 显示全部楼层
本帖已被收录到知识树中,索引项:SQL应用
小麦老师的好贴,标记下来慢慢学习。
想当初俺也跟着香帅的仙履奇缘系列认真学过一段SQL,灵活运用方面就和小麦老师差远了。
还得努力啊。

TA的精华主题

TA的得分主题

发表于 2013-5-2 16:19 | 显示全部楼层
本帖最后由 wuxiang_123 于 2013-5-2 16:20 编辑
mps777 发表于 2013-5-2 09:16
SQL里好像没有这2个函数的。
是添加辅助列吗?

  1. select 姓名,科目,成绩 from
  2. (select 姓名,'语文' as 科目,语文 as 成绩,语文*100000 as 成绩2 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 语文 desc) union all
  3. select 姓名,'数学',数学,数学*10000 as 成绩 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 数学 desc) union all
  4. select 姓名,'英语',英语,英语*1000 as 成绩 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 英语 desc) union all
  5. select 姓名,'物理',物理,物理*100 as 成绩 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 物理 desc) union all
  6. select 姓名,'化学',化学,化学*10 as 成绩 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 化学 desc) union all
  7. select 姓名,'生物',生物,生物 as 成绩 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 生物 desc) union all
  8. select 姓名,'总分',总分,总分*10^6 as 成绩 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 总分 desc)) order by 成绩2 desc
复制代码

可改为:

  1. select 姓名,科目,成绩 from
  2. (select 姓名,'语文' as 科目,语文 as 成绩 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 语文 desc) union all
  3. select 姓名,'数学',数学,数学 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 数学 desc) union all
  4. select 姓名,'英语',英语,英语 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 英语 desc) union all
  5. select 姓名,'物理',物理,物理 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 物理 desc) union all
  6. select 姓名,'化学',化学,化学 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 化学 desc) union all
  7. select 姓名,'生物',生物,生物 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 生物 desc) union all
  8. select 姓名,'总分',总分,总分 from [成绩表$] where 学号 in (select top 3 学号 from [成绩表$] order by 总分 desc))
  9. order by INSTR('总分语文数学英语物理化学生物',科目),成绩 DESC
复制代码
INSTR:从指定搜索位置开始,返回需要搜索的字符串在被搜索字符串中首次出现的位置(返回的是数字)
语法:
INSTR("起始搜索位置','被搜索的字符串','需要搜索的字符串')
其中,第一参数可省略,省略则默认为从头开始搜索。


同样地,也可以使用JION连接来代替子查询,提高速度。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-5-2 16:22 | 显示全部楼层
平平淡淡的天使 发表于 2013-5-2 10:28
你看这个。。MQ做好,重新打开,才没多少时间,就弹出此对话框

这个要视情况判断。

TA的精华主题

TA的得分主题

发表于 2013-5-2 18:00 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-5-2 19:21 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
wuxiang_123 发表于 2013-5-2 16:22
这个要视情况判断。

大师,,你觉得 我会是什么情况?这个特麻烦,筛选一下,弹出对话框。。重新做一个也是如此。。

TA的精华主题

TA的得分主题

发表于 2013-5-2 21:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
强大的东西都好复杂!感谢分享。

TA的精华主题

TA的得分主题

发表于 2013-5-2 21:27 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-5-2 22:30 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-5-3 01:52 | 显示全部楼层
wuxiang_123 发表于 2013-5-2 16:19
可改为:
INSTR:从指定搜索位置开始,返回需要搜索的字符串在被搜索字符串中首次出现的位置(返回的 ...

请问香帅老师,在使用转置时如何控制行字段的顺序呢?如小麦老师的统计各分数段人数,如何使转制后的行字段可以按“语文数学英语政治”的顺序出现?谢谢。

各分数段统计.png

转置语句为:
  1. TRANSFORM COUNT(T.成绩)
  2. SELECT T.班别, T.科目 FROM
  3. (SELECT A.*, SWITCH(A.成绩<60,"<60", A.成绩<70,"60-69", A.成绩<80,"70-79", A.成绩<90,"80-89", A.成绩>=90,"90-100") AS 成绩分段 FROM
  4. (SELECT 班别, 语文 AS 成绩, "语文" AS 科目 FROM [三班汇总$M:S] UNION ALL
  5. SELECT 班别, 数学,"数学" FROM [三班汇总$M:S] UNION ALL
  6. SELECT 班别, 英语,"英语" FROM [三班汇总$M:S] UNION ALL
  7. SELECT 班别, 政治,"政治" FROM [三班汇总$M:S]) A) T
  8. GROUP BY T.班别, T.科目
  9. PIVOT T.成绩分段
复制代码

每天都能从小麦老师和香帅老师那学到新东西。{:soso_e121:}


TA的精华主题

TA的得分主题

发表于 2013-5-3 09:26 | 显示全部楼层
在和弦处等你 发表于 2013-5-3 01:52
请问香帅老师,在使用转置时如何控制行字段的顺序呢?如小麦老师的统计各分数段人数,如何使转制后的行字 ...

  1. TRANSFORM COUNT(T.成绩)
  2. SELECT T.班别, T.科目 FROM
  3. (SELECT A.*, SWITCH(A.成绩<60,"<60", A.成绩<70,"60-69", A.成绩<80,"70-79", A.成绩<90,"80-89", A.成绩>=90,"90-100") AS 成绩分段 FROM
  4. (SELECT 班别, 语文 AS 成绩, "语文" AS 科目 FROM [三班汇总$M:S] UNION ALL
  5. SELECT 班别, 数学,"数学" FROM [三班汇总$M:S] UNION ALL
  6. SELECT 班别, 英语,"英语" FROM [三班汇总$M:S] UNION ALL
  7. SELECT 班别, 政治,"政治" FROM [三班汇总$M:S]) A) T
  8. GROUP BY T.班别, T.科目
  9. ORDER BY T.班别,INSTR('语文数学英语政治',T.科目)
  10. PIVOT T.成绩分段
复制代码

在转置中,ORDER BY是对行记录排序。
列字段排序在PIVOT中,如PIVOT 列字段 IN (列出需要返回的列字段,以逗号分隔,列字段可以为需要转置表中没有的字段)
注:列字段的项为转置后结果的列字段。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-25 10:49 , Processed in 0.044091 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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