问一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

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


该怎么实现? 本周/上周怎么实现??
谢谢!!!
...全文
122 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
换一种思路,不用单一的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

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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