一个交差表的难题,哪位帮忙看看,怎么解决,给一佰分.

txldm 2003-04-04 07:51:18
我有两个表:资料如下
一.部门表
部门编码 部门名称 级别
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
...全文
29 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
vincent_zuo 2003-05-05
  • 打赏
  • 举报
回复
请教是否可以在一条sql语句中实现上面的查询?如果可以的化,可以用asp等程序显示,否则就不好弄了。
zw_sjj 2003-04-15
  • 打赏
  • 举报
回复
可是,我用delphi的dbgrid获得查询结果,怎么只有一列???
txldm 2003-04-08
  • 打赏
  • 举报
回复
我測試之后能用再給分你們 謝謝
benxie 2003-04-07
  • 打赏
  • 举报
回复
高。
txldm 2003-04-06
  • 打赏
  • 举报
回复
好,果然是高手!!
playyuer 2003-04-05
  • 打赏
  • 举报
回复
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" 两种情况(总人数同理)!
pengdali 2003-04-04
  • 打赏
  • 举报
回复
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 #部门表,#出勤表
Rewiah 2003-04-04
  • 打赏
  • 举报
回复
最后加一句:
drop table #temp
cgsun 2003-04-04
  • 打赏
  • 举报
回复
gz
ben988211 2003-04-04
  • 打赏
  • 举报
回复
经典
Rewiah 2003-04-04
  • 打赏
  • 举报
回复
可以不用部门表

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)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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