ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 找学习相同课程的人

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-12-2 18:32 | 显示全部楼层 |阅读模式
本帖最后由 oyzhjr 于 2013-12-3 12:38 编辑

如下表为一个学生学习表,bh列为课程代号,xm列为姓名缩写.现要求通过一个查询语句查出 所学课程与ztt一致的信息.即返回结果为zhh\ztt的行.
请高人指点, 用=ALL没法得出正确结果.

bh    xm
10     zhh
20        yyy
20        zhh
30        gmm
10        ztt
20        ztt



TA的精华主题

TA的得分主题

发表于 2013-12-3 10:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
先捋一捋你写的话了再,表述的。。。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-3 12:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
zxb7679 发表于 2013-12-3 10:00
先捋一捋你写的话了再,表述的。。。。。。

谢谢,已经修改。

TA的精华主题

TA的得分主题

发表于 2013-12-3 13:38 | 显示全部楼层
  1. USE tempdb
  2. GO
  3. IF OBJECT_ID('TEST') IS NOT NULL
  4.   DROP TABLE TEST;
  5. GO
  6. CREATE TABLE TEST
  7. (
  8.   bh  CHAR(2),
  9.   xm  VARCHAR(8)
  10. );
  11. GO
  12. INSERT INTO TEST VALUES('10','zhh');
  13. INSERT INTO TEST VALUES('20','yyy');
  14. INSERT INTO TEST VALUES('20','zhh');
  15. INSERT INTO TEST VALUES('30','gmm');
  16. INSERT INTO TEST VALUES('10','ztt');
  17. INSERT INTO TEST VALUES('20','ztt');
  18. GO
  19. ----------------------------------------
  20. ;with a as
  21. (select bh from TEST where xm='ztt'),
  22. b as
  23. (select COUNT(*) as counts from TEST where xm='ztt'),
  24. c as
  25. (select xm from TEST group by xm having COUNT(*)=(select counts from b))
  26. select * from TEST
  27. where bh in (select bh from a)
  28. and xm in (select xm from c);
  29. ----------------------------------------
  30. /*
  31. bh   xm
  32. ---- --------
  33. 10   zhh
  34. 20   zhh
  35. 10   ztt
  36. 20   ztt

  37. (4 行受影响)
  38. */
  39. ----------------------------------------
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-3 16:44 | 显示全部楼层
亲,第20行代码处是不是少了点东西?

TA的精华主题

TA的得分主题

发表于 2013-12-3 17:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
修改为:
  1. 查询a为查询ztt所选课程的代码:
  2. select bh from TEST where xm='ztt'
  3. 查询b为查询ztt所选课程的数量:
  4. select COUNT(*) as counts from TEST where xm='ztt'
  5. 查询c为查询与ztt所选课程的代码相同并且所选课程的数量相同的同学:
  6. select xm from TEST as d inner join a on a.bh=d.bh
  7. group by xm having count(*)=(select counts from b)
  8. 查询所有信息:
  9. select * from TEST where xm in (select xm from c)
复制代码
  1. select * from TEST
  2. where xm in
  3. (
  4.   select xm from TEST as d
  5.   inner join
  6.   (
  7.     select bh from TEST where xm='ztt'
  8.   ) as a
  9.   a.bh=d.bh
  10.   group by xm
  11.   having count(*)=
  12.   (
  13.     select COUNT(*) as counts from TEST where xm='ztt'
  14.   )
  15. )
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-3 21:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
楼上代码不错,经测试正常。
但第8行的代码少了个 on 应为   ) as a on
我也想过用连接自身的方法进行查询,select  a.xm, a.bh from test a inner join test b on a.bh=b.bh and a.xm!=b.xm and b.xm='ztt',但返回的结果包并不正确,yyy只选了其中一门课,仍返回了结果。

楼上的代码美中不足的是无若zhh同时选了10,20,30三门课,但ztt 只选了10,20两门课,执行上述代码时,仍会把zhh选出来,但可以通过增加一个having来筛选出来,如下代码。
select * from test where xm in (
select xm  from test where xm in
(
  select xm from TEST as d
  inner join
  (      select bh from TEST where xm='ztt'   ) as a on
   a.bh=d.bh
   group by xm
having count(*)=
  (     select COUNT(*) as counts from TEST where xm='ztt'  )
)
group by xm
having count(xm)=(select count (xm)  from test e where e.xm='ztt')
)

还是非常感放谢楼上。

TA的精华主题

TA的得分主题

发表于 2013-12-4 09:13 | 显示全部楼层
  1. USE tempdb
  2. GO
  3. IF OBJECT_ID('TEST') IS NOT NULL
  4.   DROP TABLE TEST;
  5. GO
  6. CREATE TABLE TEST
  7. (
  8.   bh  CHAR(2),
  9.   xm  VARCHAR(8)
  10. );
  11. GO
  12. INSERT INTO TEST VALUES('10','zhh');
  13. INSERT INTO TEST VALUES('20','zhh');
  14. INSERT INTO TEST VALUES('10','gmm');
  15. INSERT INTO TEST VALUES('20','gmm');
  16. INSERT INTO TEST VALUES('30','gmm');
  17. INSERT INTO TEST VALUES('10','ztt');
  18. INSERT INTO TEST VALUES('20','ztt');
  19. INSERT INTO TEST VALUES('20','yyy');
  20. GO
  21. ----------------------------------------
  22. ;with
  23. a as
  24. (select bh from TEST where xm='ztt'),
  25. b as
  26. (select COUNT(*) as counts from TEST where xm='ztt'),
  27. c as
  28. (select xm from TEST group by xm having COUNT(*)=(select counts from b)),
  29. d as
  30. (select t.xm from TEST as t join a on t.bh = a.bh join c on t.xm = c.xm group by t.xm having COUNT(*)=(select counts from b))
  31. select * from d
  32. ----------------------------------------
  33. /*
  34. xm
  35. --------
  36. zhh
  37. ztt

  38. (2 行受影响)
  39. */
  40. ----------------------------------------
复制代码
修改测试数据,选3门的gmm和1门的yyy都不会出现在结果中了
原理和楼上你的应该差不多

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-12-4 11:53 | 显示全部楼层
楼上的代码是SQL2005以上的吧?

TA的精华主题

TA的得分主题

发表于 2013-12-4 15:17 | 显示全部楼层
  1. SELECT B.* FROM
  2. (SELECT BH FROM 表 WHERE XM='ZTT')A,
  3. (SELECT BH,XM FROM 表 WHERE XM<>'ZTT')B,
  4. (SELECT XM,COUNT(BH) AS 课程 FROM 表 GROUP BY XM)C,
  5. (SELECT COUNT(BH) AS 课程 FROM 表 WHERE XM='ZTT')D
  6. WHERE A.BH=B.BH AND B.XM=C.XM AND C.课程=D.课程
复制代码

假设表名称是表.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 14:17 , Processed in 0.038098 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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