问一SQL语句 ~~~~急!!! 在线等!!!!!

shaoml 2008-04-26 07:38:57
也可以看另一个贴 http://topic.csdn.net/u/20080426/16/a3560817-548c-4eeb-9397-17230772d725.html?seed=2099815257


DIVISION_ID NATION_ID ZDRS WEEKNUM
海淀 3 34 6
海淀 2 33 6
海淀 1 22 6
昌平 3 44 6
昌平 2 32 6
昌平 1 54 6
西城 1 42 6
西城 2 44 6
海淀 1 45 5
海淀 2 55 5
海淀 3 176 5
昌平 3 233 5
昌平 2 4 5
西城 2 6 5
西城 1 73 5
==============================================
可以建表
create table tb(DIVISION_ID varchar(20),NATION_ID int,ZDRS int,WEEKNUM int)
insert into tb values('海淀',3,34,6)
insert into tb values('海淀',2,33,6)
insert into tb values('海淀',1,32,6)
insert into tb values('昌平',3,44,6)
insert into tb values('昌平',2,32,6)
insert into tb values('昌平',1,54,6)
insert into tb values('西城',1,42,6)
insert into tb values('西城',2,44,6)
insert into tb values('海淀',1,45,5)
insert into tb values('海淀',2,55,5)
insert into tb values('海淀',3,176,5)
insert into tb values('昌平',3,233,5)
insert into tb values('昌平',2,4,5)
insert into tb values('西城',2,6,5)
insert into tb values('西城',1,73,5)
go

==================================================================


在weeknum 列 表示周数 即为第几周 weeknum中最大的为本周,weeknum-1为上周,weeknum-4为上月,

我想写sql语句 实现查本周数据,上周数据。 然后本周与上周比 即 本周/上周
我这样写:
select DIVISION_ID,
NATION_ID,
sum(case WEEKNUM when max(weeknum)-1 then ZDRS else 0 end) [上周],
sum(case WEEKNUM when max(weeknum) then ZDRS else 0 end) [本周]
from tb
group by DIVISION_ID,NATION_ID
order by DIVISION_ID,NATION_ID

==========================================================
不能对包含聚合或子查询的表达式执行聚合函数。


该怎么实现? 本周/上周怎么实现??
谢谢!!!
...全文
73 点赞 收藏 4
写回复
4 条回复
LeftDragonRightTiger 2008年04月28日
换一种思路,不用单一的SQL语句,改用分步的Procedure实现:

--取本周
declare @this_week int
select @this_week = max(weeknum) from tb;
--计算本周/上周
select DIVISION_ID,
NATION_ID,
sum(case WEEKNUM when @this_week - 1 then ZDRS else 0 end) [上周],
sum(case WEEKNUM when @this_week then ZDRS else 0 end) [本周]
from tb
group by DIVISION_ID,NATION_ID
order by DIVISION_ID,NATION_ID
回复 点赞
hebo2005 2008年04月26日
看了你另一贴子,我这是ORACLE里的写法,SQL里没这两个分析函数的
回复 点赞
hebo2005 2008年04月26日
SELECT a division_id, nation_id, aa.sum_zdrs "本周", aa.pre_sum_zdrs "上周",
DECODE (aa.pre_sum_zdrs,
0, NULL,
aa.sum_zdrs / aa.pre_sum_zdrs
) "本周/上周"
FROM (SELECT division_id, nation_id, weeknum, SUM (zdrs) sum_zdrs,
LAG (SUM (zdrs), 1, 0) OVER (PARTITION BY division_id, nation_id ORDER BY weeknum)
pre_sum_zdrs,
ROW_NUMBER () OVER (PARTITION BY division_id, nation_id ORDER BY weeknum DESC)
rn
FROM tb
GROUP BY division_id, nation_id, weeknum) a
WHERE aa.rn = 1


排了下版,修正了两个分析函数少写了BY的错误
回复 点赞
hebo2005 2008年04月26日
select a DIVISION_ID,NATION_ID,aa.sum_zdrs "本周",aa.pre_sum_zdrs "上周",decode(aa.pre_sum_zdrs,0,null,aa.sum_zdrs/aa.pre_sum_zdrs) "本周/上周"

from(
select DIVISION_ID,NATION_ID,WEEKNUM ,sum(zdrs) sum_zdrs,
lag(sum(zdrs),1,0) over(partition DIVISION_ID,NATION_ID order by weeknum) pre_sum_zdrs,
row_number() over(partition DIVISION_ID,NATION_ID order by weeknum desc) rn
from tb
group by DIVISION_ID,NATION_ID,WEEKNUM ) a
where aa.rn=1
回复 点赞
发动态
发帖子
基础和管理
创建于2007-09-28

7175

社区成员

9.5w+

社区内容

Oracle 基础和管理
社区公告
暂无公告