一个交差表的难题,哪位帮忙看看,怎么解决,给一佰分.
我有两个表:资料如下
一.部门表
部门编码 部门名称 级别
01 管理部 1
0101 行政部 2
02 生产部 1
0201 一车间 2
二.出勤表
日期 部门 总人数 出勤人数
2003-03-01 行政部 50 45
2003-03-01 一车间 500 490
2003-03-02 行政部 50 45
2003-03-02 一车间 500 490
2003-03-03 行政部 50 49
2003-03-03 一车间 500 498
我要得出的结果是如下:请问如果用SQL语句写能否写或者有什么更好的方法,不用程序开发工具.
行政部 一车间
日期 总人数 出勤人数 总人数 出勤人数
2003-03-01 50 45 500 490
2003-03-02 50 45 500 490
2003-03-02 50 49 500 498
问题点数:0、回复次数:11Top
1 楼Rewiah(乘长风)回复于 2003-04-04 20:11:29 得分 0
可以不用部门表
declare @sql varchar(8000)
set @sql=''
select distinct 部门 into #temp from 出勤表
select @sql=@sql+',sum(case when 部门='''+rtrim(部门)+''' then 总人数 else 0 end) as '+rtrim(部门)+'总人数,sum(case when 部门='''+rtrim(部门)+''' then 出勤人数 else 0 end) as '+rtrim(部门)+'出勤人数' from #temp
set @sql='select 日期'+@sql+' from 出勤表 group by 日期 order by 日期'
exec (@sql)
Top
2 楼ben988211(???)回复于 2003-04-04 20:25:28 得分 0
经典Top
3 楼cgsun(colin)回复于 2003-04-04 21:04:36 得分 0
gzTop
4 楼Rewiah(乘长风)回复于 2003-04-04 21:34:38 得分 0
最后加一句:
drop table #temp
Top
5 楼pengdali()回复于 2003-04-04 22:59:35 得分 0
create table #部门表 (部门编码 varchar(100),部门名称 varchar(100),级别 int)
insert #部门表 values('01','管理部', 1 )
insert #部门表 values('0101', '行政部', 2)
insert #部门表 values('02' , '生产部' , 1)
insert #部门表 values('0201' , '一车间' , 2)
create table #出勤表(日期 datetime,部门 varchar(100),总人数 int,出勤人数 int)
insert #出勤表 values('2003-03-01','行政部', 50 , 45)
insert #出勤表 values('2003-03-01','一车间' , 500 , 490)
insert #出勤表 values('2003-03-02','行政部' , 50 , 45)
insert #出勤表 values('2003-03-02','一车间' ,500 , 490)
insert #出勤表 values('2003-03-03','行政部' , 50 , 49)
insert #出勤表 values('2003-03-03','一车间', 500 , 498)
declare @sql varchar(8000)
set @sql=''
---如果没有出勤也要列出:
select @sql=@sql+',sum(case when 部门='''+部门名称+''' then 总人数 else 0 end) '+部门名称+'总人数,sum(case when 部门='''+部门名称+''' then 出勤人数 else 0 end) as '+部门名称+'出勤人数' from #部门表
exec ('select 日期'+@sql+' from #出勤表 group by 日期 order by 日期')
--如过不列出可以这样:
set @sql=''
select @sql=@sql+',sum(case when 部门='''+部门+''' then 总人数 else 0 end) '+部门+'总人数,sum(case when 部门='''+部门+''' then 出勤人数 else 0 end) as '+部门+'出勤人数' from (select distinct 部门 from #出勤表) aa
exec ('select 日期'+@sql+' from #出勤表 group by 日期 order by 日期')
go
drop table #部门表,#出勤表Top
6 楼playyuer(退休干部 卧鼠藏虫)回复于 2003-04-05 00:13:17 得分 0
declare @sql varchar(8000)
set @sql=''
select @sql=@sql + ',(select sum(总人数) from #出勤表 where 日期 = T.日期 and 部门 =''' + 部门 + ''') as ' + 部门 + '总人数'
+ ',(select sum(出勤人数) from #出勤表 where datediff(day,日期,T.日期) =0 and 部门 =''' + 部门 + ''') as ' + 部门 + '出勤人数'
from #出勤表
group by 部门
exec ('select 日期'+@sql+' from #出勤表 T group by 日期 order by 日期')
set @sql=''
select @sql=@sql + ',(select sum(总人数) from #出勤表 where 日期 = T.日期 and 部门 =''' + 部门名称 + ''') as ' + 部门名称 + '总人数'
+ ',(select sum(出勤人数) from #出勤表 where datediff(day,日期,T.日期) =0 and 部门 =''' + 部门名称 + ''') as ' + 部门名称 + '出勤人数'
from #部门表
exec ('select 日期'+@sql+' from #出勤表 T group by 日期 order by 日期')
--我的答案相对大刀: 效率较低
--但 SQL 语法兼容其他数据库较好(可用于不支持Case when 的数据库语法)
--另外可以明确区分 "出勤数的确有记录且是O"和"没有出勤记录Null" 两种情况(总人数同理)!Top
7 楼txldm(txldm)回复于 2003-04-06 17:58:08 得分 0
好,果然是高手!!Top
8 楼benxie(结婚是幸福的!为了老婆努力赚钱!)回复于 2003-04-07 03:58:51 得分 0
高。Top
9 楼txldm(txldm)回复于 2003-04-08 17:50:00 得分 0
我測試之后能用再給分你們 謝謝Top
10 楼zw_sjj(我无知)回复于 2003-04-15 15:56:08 得分 0
可是,我用delphi的dbgrid获得查询结果,怎么只有一列???Top
11 楼vincent_zuo(虬髯客)回复于 2003-05-05 23:10:02 得分 0
请教是否可以在一条sql语句中实现上面的查询?如果可以的化,可以用asp等程序显示,否则就不好弄了。Top




