想实现这样的一个统计工作,如何用sql实现?(100分)

  • 主题发起人 主题发起人 sxbug
  • 开始时间 开始时间
S

sxbug

Unregistered / Unconfirmed
GUEST, unregistred user!
代码表的数据如下:
type code name memo
---------------------------------------------
region 420001 河北省
region 420100 河北省沙市
region 420110 河北省阜市
.....
region 430000 湖南省
region 430001 湖南省长沙
region 430002 湖南省株洲市
.....
region 440001 湖北省
.....
depart 001 办公室
depart 002 财务处
depart 003 党办
depart 004 1处
.....
depart 098 退休办
......

人员表数据如下:
emp_no Emp_name Depart region ages memo
-------------------------------------------------------------
001 张三 009 432401 20
002 李四 001 420001 30
003 王武 002 440001 42
......

现在想做一个这样的统计:
单位|地区 湖北省 湖南省 江苏省 河北省 .....
办公室 3 0 4 0
财务处 1 10 0 0
党办 0 4 0 1
1处 1 1 0 1
....
统计每个部门在每个省的人员分别是多少?
望各位指教!!!
(delphi6+oracle9)

 
一条SQL解决不了吧。
 
select count(emp_no) from 人员表 group by depart,region
试试啦,我也不知道是否可以啊
 
to delphilove
select count(emp_no) from 人员表 group by depart,region
你这样,显然不可以的。
 
为什么呢?
先以部门分组,再以地区分组
 
不是一定用一条sql,简单的办法,怎么实现?
要解决的问题:1、地区的号码只取前2位的来用
2、行和列都比较多,delphi的sql最多能放多少字节的sql语句?
3、如果要将为0的数据去掉,估计工作更难,是吗?
 
要取出数据没问题,只是格式难办。
此处你的统计表列是不固定的,所以除了用SQL以外,必须有其他的辅助手段。
我的办法是用CROSSTAB或者是用临时表。
如果要取出数据可以这样写SQL:
SELECT
C.CODE
C.NAME,
B.CODE
B.NAME,
COUNT(A.EMP_NO)

FROM

人员表数据表 A
(
SELECT DISTINCT SUBSTR(REGION,1,2) CODE NAME FROM 代码表 WHERE TYPE='region'
) B,
(
SELECT CODE NAME FROM 代码表 WHERE TYPE='depart'
)C

WHERE
B.CODE=SUBSTR(A.REGION,1,2) AND
C.CODE=A.DEPART AND
GROUP BY
C.CODE,C.NAME,B.CODE,B.NAME
然后,你想法去解决格式的问题吧。SQL是不能动态生成列的,除非用程序构造SQL语句才行。
 
to sentiment:
有意思!
我再想想.....
 
是三张表之间关联的问题,
select count(a.emp_no)from 人员表 a left join 部门表 b on 关联(ID)
left join 省份 c on 关联(ID)

试试看,
 
谢谢大家
我等一会再试
我比较同意用程序生成sql语句的方法
继续等好方法
 
后退
顶部