再次求SQL或存储过程!

LONGFOR 2006-11-19 10:06:23
有两个表(abc)和(bm),字段如下:
表abc
abcid(编号) abcdq(地区) abcbm(部门) abctime(时间)
1 0101 100 2005-01-02
2 0102 100 2005-07-01
3 0103 200 2007-07-02
4 0101 300 2006-01-10
5 0102 400 2006-01-20
6 0101 100 2005-01-02
7 0102 300 2005-07-01
8 0103 400 2006-07-02
9 0101 300 2006-01-10


表bm
bmid bmnm ----注: bm.bmid=abc.abcbm
100 中部
200 北部
300 西部
400 南部
500 东部

要求是:查某一地区(0101)某年(06)12个月(这也是动态的,有可能是1-3月或是7-12月)跟前一年(05)12个月(同06括号对应)的总笔数的对比,以部门/每月为组,查询出的ABCBM是以bm来取,因为考虑到ABC中可能没有某一部门的,如没有则值为0。其中地区跟某年是动态的
如:查所有地区,所有部门,1-4月06年跟05年的数据对比
结果如下:

abcdq bmid bmnm 时间 06年 05年
0101 100 中部 1月 1 3
2月 0 0
3月 0 0
4月 0 0

200 北部 1月 0 0
2月 0 0
3月 0 0
4月 0 0
... ... ... . . /*表示省略若干个部门1-4月
合计 1月 1 3
... ... ... ... . . /*表示省略若干个地区1-4月
合计 1月 1 3
... . . /* 所有1-4月
总计 * * /*
谢谢大伙帮忙,给个思路也有分!
...全文
331 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
李睿_Lee 2007-02-05
  • 打赏
  • 举报
回复
太多了,没时间看。
帮顶一下。
Mapleleaf123 2007-02-05
  • 打赏
  • 举报
回复
友情UP了~120分

-_-
LONGFOR 2007-02-05
  • 打赏
  • 举报
回复
lcw321321(文子),是呀,可能是我加了条件吧
lcw321321 2007-02-04
  • 打赏
  • 举报
回复
001部门没有了!
不知道要怎样做才能把所有的部门全显示出来!请各位赐教,小女子感激不尽!
-----------------
用左(右)连接不是所有的部门都来了吗?
cceon 2007-02-03
  • 打赏
  • 举报
回复
你是想取得报表么?

我在想用其他的方法也可以做到你想要的结果,不管怎么样,只要达到同样的结果,越简单的方法越高级。

你比如导出到excel,然后再怎么处理一下,这种工作excel还是比较好弄的吧。
LONGFOR 2007-02-03
  • 打赏
  • 举报
回复
我已经做到了,但是发现了一个问题:

CREATE PROC GetCS_BMM
@Stime1 varchar(255),
@Stime2 varchar(255),
@Sdp varchar(255),
@Smonth varchar(255)
as

declare @sql varchar(8000)
set @sql=''

select
@sql=@sql+',['+rtrim(cs_time1)+']=sum(case year(b.cs_time1) when '+rtrim(cs_time1)+' then 1 else 0 end),['+rtrim(cs_time1)+']=rtrim(sum(case year(b.cs_time1) when '+rtrim(cs_time1)+' then 1 else 0 end)*100/(select count(1) from v_cs where year(cs_time1)='+rtrim(cs_time1)+'))+''%'''

from
(select distinct year(cs_time1) as cs_time1 from v_cs where year(cs_time1)>=@Stime1 and year(cs_time1)<=@Stime2) t
order by
t.cs_time1 desc

select @sql='select cs_bmID=isnull(cast(a.cs_bmid as varchar(8)),''合计'')'+@sql
+'from Fr_cs_bm a left join v_cs b on a.cs_bmid=b.cs_bm where b.cs_dp='+@Sdp+' and month(b.cs_time1)='+@Smonth+' group by a.cs_bmid with rollup'
from
(select max(year(cs_time1)) as cs_time1 from v_cs where year(cs_time1)>=@Stime1 and year(cs_time1)<=@Stime2) t1

exec(@sql)
GO
EXEC GETCS_BMM '2003','2007','0101','3'


-------------结果-------------------------
------结果-------
002 0 0% 2 2% 0 0% 0 0% 1 8%
003 0 0% 1 1% 0 0% 0 0% 0 0%
004 0 0% 0 0% 0 0% 1 11% 0 0%
005 0 0% 1 1% 0 0% 0 0% 0 0%
合计 0 0% 4 5% 0 0% 1 11% 1 8%
--------------------------------------------------------------------
001部门没有了!
不知道要怎样做才能把所有的部门全显示出来!请各位赐教,小女子感激不尽!
stou 2006-11-20
  • 打赏
  • 举报
回复
up
LONGFOR 2006-11-20
  • 打赏
  • 举报
回复
shiliangdong(笑笑而过) 谢谢帮顶!
xuStanly 2006-11-19
  • 打赏
  • 举报
回复
按月份时间段生成临时表,
如:
月份    开始         结束
2006-01  2006-01-01 00:00:00: 2006-2-1 00:00:00

--取得分时间段,存入临时表
--@startDate和@endDate为传入参数(字符型),查询时间段
declare @sd datetime--开始日期
declare @ed datetime--结束日期
select @sd=cast(@startDate as datetime)
select @ed=cast(@endDate as datetime)
create table #t(
日期 varchar(10),
开始 varchar(20),
结束 varchar(20)
)
declare @tmp datetime
while @sd <= @ed
begin
select @tmp=dateadd(month,1,@sd)
insert into #t
select convert(varchar(10),@sd,111),
convert(varchar(10),@sd,111)+' 00:00:00',
convert(varchar(10),@tmp,111)+' 00:00:00'
select @sd=@tmp
end

再按临时表的分段,取相应时间段的合计。
LONGFOR 2006-11-19
  • 打赏
  • 举报
回复
zhaominsheng(世界未日),这我也知道要用GROUP BY可是写出来就是不对劲,可能是思路不对。所以才上来问啦。
另如在结果再加06每个月跟05年的一个百分对比(比如06年1月是20,05年1月10,百分比为:(20-10)/10)=100% ,就会出现05年某月为0的时候,如何解决呢?是要先写一个判断的语句吗?

菜鸟SQL学得不好,现在急要用到,只好求助大伙了!偶在此万分感激!
zhaominsheng 2006-11-19
  • 打赏
  • 举报
回复
可以用GROUP BY 和COMPUTER

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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