我要统计数据表1里的一个字段如下:
字段名:隶属部门
记录: 业务部
资源部
人事部
管理部
而且字段名:隶属部门里的记录是随时增加的要统计出每个部门里的人数,
然后把结果显示在数据表2里,要求分别统计出每个部门里的男女人数,最后还要合计数。
数据表2结构为:
字段名:项目 男 女 合计
备注:我用的是dbisam数据库,select语句的语法如下:
SELECT [DISTINCT | ALL] * | column
[AS correlation_name | correlation_name], [column...]
[INTO [MEMORY] destination_table]
FROM [MEMORY] table_reference [AS correlation_name | correlation_name]
[[[[INNER | [LEFT | RIGHT] OUTER JOIN] [MEMORY] table_reference
[AS correlation_name | correlation_name] ON join_condition]
[WHERE predicates]
[GROUP BY group_list]
[HAVING predicates]
[ORDER BY order_list [NOCASE]]
[TOP number_of_rows]
[WITH LOCKS]
[LANGUAGE language_string SORT sort_string]
[ENCRYPTED WITH password]
[NOJOINOPTIMIZE]
[UNION [ALL] [SELECT...]]
字段名:隶属部门
记录: 业务部
资源部
人事部
管理部
而且字段名:隶属部门里的记录是随时增加的要统计出每个部门里的人数,
然后把结果显示在数据表2里,要求分别统计出每个部门里的男女人数,最后还要合计数。
数据表2结构为:
字段名:项目 男 女 合计
备注:我用的是dbisam数据库,select语句的语法如下:
SELECT [DISTINCT | ALL] * | column
[AS correlation_name | correlation_name], [column...]
[INTO [MEMORY] destination_table]
FROM [MEMORY] table_reference [AS correlation_name | correlation_name]
[[[[INNER | [LEFT | RIGHT] OUTER JOIN] [MEMORY] table_reference
[AS correlation_name | correlation_name] ON join_condition]
[WHERE predicates]
[GROUP BY group_list]
[HAVING predicates]
[ORDER BY order_list [NOCASE]]
[TOP number_of_rows]
[WITH LOCKS]
[LANGUAGE language_string SORT sort_string]
[ENCRYPTED WITH password]
[NOJOINOPTIMIZE]
[UNION [ALL] [SELECT...]]
解决方案 »
- 求可以对其他程序进行apihook的可用代码!!谢谢
- 怎样自定义DBGrid组件字段的属性选项?
- 一个简单的问题,简直就是送分。
- adoz组件问题
- delphi中怎么在dll中导出一个类?
- 我靠, dudunono (Cookies) 名目张胆的给 l_xiaofeng(流水不腐) 送出2000分,要不是倒分,我把名字倒着写!
- 我用的是FASTREPORT打印控件,在WIN98平台中自定义纸张用的打印机是松下1121打印机但是打印预览很正常打印出来页头上的字不能打出,页脚
- 如何将TXT文本转化成HTML格式
- 有一个库调用的问题
- 关于窗体之间控件的调用问题MIDChild求大神
- 怎样调用系统默认的邮件收发工具?
- 今天只想找地方散分!!
,sum(case when Gender="M" then 1 else null end) as Male
,sum(case when Gender="F" then 1 else null end) as Female
,count( * ) as SubTotal
from Table1
group by Department
你可以看看上面的dbisam数据库,select语句的语法。
隶属部门,姓名,性别
。
业务部 张三 男
人事部 李四 男
资源部 王五 男
管理部 李丽 女
管理部 赵六 男
。然后你要得到如下结果:
部门, 男,女,总数
管理部 1 1 2
人事部 1 0 1
业务部 1 0 1
资源部 1 0 1
。
先来建立测试表、并加入上述数据
create table table1(隶属部门 char(10), 姓名 char(10), 性别 char(2))
insert into table1 values('业务部','张三','男')
insert into table1 values('人事部','李四','男')
insert into table1 values('资源部','王五','男')
insert into table1 values('管理部','李丽','女')
insert into table1 values('管理部','赵六','男')在SQL里有一种比较简洁的写法,但是你的数据库不支持,就不用再提了,
来看一看子查询的方法:把你的需求分为四步
1、 将表中存在人员按部门汇总,;
select distinct 隶属部门,count(*) as 总数 from table1 group by 隶属部门
//把这个结果集体当作表A
2、 将表中男性人员按部门汇总
select 隶属部门,count(*) as 男 from table1 where 性别='男' group by 隶属部门
//把这个结果集体当作表B
3、 将表中女性人员按部门汇总
select 隶属部门,count(*) as 女 from table1 where 性别='女' group by 隶属部门
//把这个结果集体当作表C
然后B、C分别与A关联,可的出你想要的结果如下:
select A. 隶属部门,B.男,C.女,A. 总数
from
(select distinct 隶属部门,count(*) as 总数 from table1 group by 隶属部门) A
left join
(select 隶属部门,count(*) as 男 from table1 where 性别='男' group by 隶属部门) B
on A.隶属部门=B.隶属部门
left join
(select 隶属部门,count(*) as 女 from table1 where 性别='女' group by 隶属部门) C
on A.隶属部门=C.隶属部门为避免关联后出现NULL,可使用isnull函数select A. 隶属部门,isnull(B.男,0) as 男 ,isnull(C.女,0) as 女,A. 总数
from
(select distinct 隶属部门,count(*) as 总数 from table1 group by 隶属部门) A
left join
(select 隶属部门,count(*) as 男 from table1 where 性别='男' group by 隶属部门) B
on A.隶属部门=B.隶属部门
left join
(select 隶属部门,count(*) as 女 from table1 where 性别='女' group by 隶属部门) C
on A.隶属部门=C.隶属部门如上,可得到你想要的结果。
隶属部门, 男,女,总数
管理部 1 1 2
人事部 1 0 1
业务部 1 0 1
资源部 1 0 1
如果你的数据库连上述子查询都不能支持,那就按上述思路写成存储过程吧。
提示信息如下:
DBISAM Engine Error # 11949 SQL error - End of Select Statement expected,instead found '隶属部门'
但看了一些说明,是支持标准SQL查询的
DBISAM 3.07 1.2M
优秀的文件型数据库引擎,拥用自己特有的文件格式和接口,编译后的程序可以独立运行,不需要BDE、ODBC或者是ADO的支持,其引擎(约200KB-300KB)已包含在编译后的EXE文件中,支持标准的SQL查询,支持多用户并发访问,支持事务处理,支持文件加密,特别适合制作小型的数据库管理程序。另外,DBISAM还自带了实用程序,可以方便地建立、修改、加密数据库以及将多种格式的数据库转换为自己的数据库格式。DBISAM数据库创建设计转换管理工具下载Additional Software and Utilities
你到SQL版去问一下,看有没有人用过
SQL.Add('select '+i+',count((性别="男")) as 男,count((性别="女")) as 女,count(*) as 合计 into 数据表2 from 数据表1 group by '+i+'');
结果如下:
数据表1里的内容 数据表2里的内容
姓名 性别 隶属部门 隶属部门 男 女 合计
张三 男 业务部 业务部 1 1 1
李四 女 管理部 管理部 1 1 1
正确的统计结果应该是这样才对呀,如下:
数据表1里的内容 数据表2里的内容
姓名 性别 隶属部门 隶属部门 男 女 合计
张三 男 业务部 业务部 1 0 1
李四 女 管理部 管理部 0 1 1
这是我自己写的语句,应该怎么改才能行出正确统计结果呀。
SQL.Add('select 隶属部门,count((性别="男")) as 男,count((性别="女")) as 女,count(*) as 合计 into 数据表2 from 数据表1 group by 隶属部门');
结果如下:
数据表1里的内容 数据表2里的内容
姓名 性别 隶属部门 隶属部门 男 女 合计
张三 男 业务部 业务部 1 1 1
李四 女 管理部 管理部 1 1 1
正确的统计结果应该是这样才对呀,如下:
数据表1里的内容 数据表2里的内容
姓名 性别 隶属部门 隶属部门 男 女 合计
张三 男 业务部 业务部 1 0 1
李四 女 管理部 管理部 0 1 1
iff(...)或case....
貼上有關判斷的syntax來看看吧