如果你是sql语句的高手,请看

isage2002 2001-12-20 10:18:33
用access建立以数据库,有一下字段
车间,姓名,出生日期,婚否,学历

要求用access支持的sql语句查询按照[车间]分类统计出下表
车间、20岁以下人数、20-30岁人数、30-40岁人数、已婚、未婚、研究生、大学、大专、高中及以下
...全文
168 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
xfflean 2001-12-20
  • 打赏
  • 举报
回复
: junglerover(灌木丛) 
引用Dao 3.60后,
Dim ret As Recordset
Set ret = OpenDatabase("C:\WINDOWS\Desktop\数据库\数据库\test.mdb").OpenRecordset("Select b.B20 From (Select count(*) As B20 From T1 Where (T1.年龄 Between 0 And 20) Group By 车间) As b")
ret.MoveLast
ret.MoveFirst
MsgBox ret.Fields(0).Name
MsgBox ret.Fields(0).Value
测试成功,又学多点东西,谢咯~~~:)
junglerover 2001-12-20
  • 打赏
  • 举报
回复
老兄,你气死我了。
“我以上写的SQL语句百分之百可在Access2000及以上版本中通过”
你没有看到?

你知不知道VISDATA用的是什么数据访问对象?DAO 3.51 !
你有本事用它打开一个ACCESS2000数据库给我看????

怎么我在这里说,说了又说,你就是听不进去呢???
自己装一个OFFICE2000,在ACCESS里测!
要有问题我头砍下来给你。
xfflean 2001-12-20
  • 打赏
  • 举报
回复
还是没用啊,我是用vb6自带的数据库管理器测试的.
Select b.B20 From (Select count(*) As B20 From T1 Where (T1.年龄 Between 0 And 20) Group By 车间) As b 出现错误..
而Select count(*) As B20 From T1 Where (t1.年龄 Between 0 And 20) Group By 车间
执行正常..
junglerover 2001-12-20
  • 打赏
  • 举报
回复
我以上写的SQL语句百分之百可在Access2000及以上版本中通过,
如果不信SQL可以这样写,那么你随便找一个表写个最简单的:

select * from (select * from table1) as a

注意一定要有 as a .
看看能不能通过?究竟有没有用???????????
snakeyin 2001-12-20
  • 打赏
  • 举报
回复
你別老是叫我回答, 我不會
isage2002 2001-12-20
  • 打赏
  • 举报
回复
需求真正的高手回答
xfflean 2001-12-20
  • 打赏
  • 举报
回复
: junglerover(灌木丛) 
老兄,SQL我也正在学,只是发表意见,不算胡说吧.
还有From 后面的Table能用你以上的格式吗?这我还是第一次看到,
我试过了,怎么没用啊
isage2002 2001-12-20
  • 打赏
  • 举报
回复
试试看 :)
junglerover 2001-12-20
  • 打赏
  • 举报
回复
你的意思很清楚,不过在一句SQL中实现的确比较困难。

如果是SQL SERVER,windindance的意思是对的,但是细节还有点不对。
出生日期 < 20 改成 当前日期-出生日期 < 20*365 就成了。
可惜ACCESS不支持CASE 语句。

isage2002和xfflean是胡说。

在ACCESS下,我们只能通过临时建立视图的办法来解决这个问题。
假定你的表叫TABLE1,那么如下SQL语句可以解决:

select Table1.车间,
a.Amount as 20以下, b.Amount as 20到30, ....
from TABLE1, (select 车间, Count(*) as Amount from TABLE1 where 当前日期-出生日期 < 20*365 group by 车间) as a,
(select 车间, Count(*) as Amount from TABLE1 where 当前日期-出生日期 >= 20*365 and 当前日期-出生日期 <= 30*365 group by 车间) as b, ......
where TABLE1.车间=a.车间 and TABLE1.车间=b.车间 ......
group by Table1.车间, a.amount, b.amount, ......
order by Table1.车间

这样基本就可以解决了。不过考虑到各个数量可能为0的问题……
最好还是把联表方式改为LEFT JOIN,这样才算完全成功。
windindance 2001-12-20
  • 打赏
  • 举报
回复
select 车间 ,
count(case 出生日期 < 20 THEN 1 ELSE 0 END) as '<20',
count(case 出生日期 >= 20 AND 出生日期 < 30 THEN 1 ELSE 0 END) as '20-30'
from T1
group by 车间

一定可以。
xfflean 2001-12-20
  • 打赏
  • 举报
回复
Select 车间,count(姓名) AS B20 From T1 where (t1.年龄 BETWEEN 0 And 20) And (t1.车间='车间1')
isage2002 2001-12-20
  • 打赏
  • 举报
回复
即便是sql你的好像也不对吧
我的意思是:
一车间中20岁以下人数、20-30岁人数、30-40岁人数、已婚、未婚、研究生、大学、大专、高中及以下 人数是多少
二车间中20岁以下人数、20-30岁人数、30-40岁人数、已婚、未婚、研究生、大学、大专、高中及以下 人数是多少
.......
xfflean 2001-12-20
  • 打赏
  • 举报
回复
Select 车间,count(姓名) AS b20 From t1 Where T1.年龄 BETWEEN 0 And 20
windindance 2001-12-20
  • 打赏
  • 举报
回复
select 车间 ,
count(case 出生日期 < 20 THEN 1 ELSE 0 END) as '<20',
...
from T1
group by 车间
SQL SERVER支持,ACCESS不知道。
isage2002 2001-12-20
  • 打赏
  • 举报
回复
高手都还在睡觉吧 哈哈哈哈哈哈
isage2002 2001-12-20
  • 打赏
  • 举报
回复
如何在上面加入分类呢
isage2002 2001-12-20
  • 打赏
  • 举报
回复
设你的表名为T1
select 车间,(select count(*) from t1 as t1_1 where year(now)-year(t1_1.出生日期)<20) as 20岁以下人数,
(seleclt count(*) from t1 as t1_2 where year(now)-year(t1_2.出生日期)>=20 and year(now)-year(t1_2.出生日期)<30) as 20-30岁人数,
(seleclt count(*) from t1 as t1_3 where year(now)-year(t1_3.出生日期)>=30 and year(now)-year(t1_3.出生日期)<40) as 30-40岁人数,
(seleclt count(*) from t1 as t1_4 where 婚否=true) as 已婚,
(seleclt count(*) from t1 as t1_5 where 婚否=false) as 未婚,
(seleclt count(*) from t1 as t1_6 where 学历="研究生") as 研究生,
(seleclt count(*) from t1 as t1_7 where 学历="大学") as 大学,
(seleclt count(*) from t1 as t1_8 where 学历="大专") as 大专,
(seleclt count(*) from t1 as t1_7 where 学历="高中有以下") as 高中及以下
from T1;

这个答案看来是不对的
三杯倒 2001-12-20
  • 打赏
  • 举报
回复
1111
知足常乐 2001-12-20
  • 打赏
  • 举报
回复
up~
isage2002 2001-12-20
  • 打赏
  • 举报
回复
正确
加载更多回复(4)

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧