高分求解sql问题---100不够再加100分

hdkkk 2003-08-11 08:25:40
比如有一个表是这样的:
column_name: date_id area_id value1 value2
datatype: char(20) int decimal(8) decimal(10)
数据如下: 20021201 1 100
20021201 2 212
20021201 3 263

20021202 1 221
20021202 2 223
20021202 3 163

20021203 1 45
20021203 2 76
20021203 3 567
.
.
.
20021231 1 56
20021231 2 67
20021231 3 434

现在要求使用一句sql update(最好是一句) 使value2数据是根据日期为当天日期以前日期所有value1的和
变为:
column_name: date_id area_id value1 value2
datatype: char(20) int decimal(8) decimal(10)
数据如下: 20021201 1 100 100
20021201 2 212 212
20021201 3 263 263

20021202 1 221 321 --100+221
20021202 2 223 435 --212+223
20021202 3 163 426 --263+163

20021203 1 45 366 --100+221+45
20021203 2 76 511 --212+223+76
20021203 3 567 993 --263+163+567
.
.
.
20021231 1 56 3123213 --前面31日前所有area_id为1的value1的sum
20021231 2 67 123121231 --前面31日前所有area_id为2的value1的sum
20021231 3 434 44343565 --前面31日前所有area_id为3的value1的sum

---------------------------------------
那位大虾解决一下?
...全文
70 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2003-08-11
  • 打赏
  • 举报
回复
因为你内层表中引用了外层表的字段,所以要么对外层表指定别名,直接在内层表中引用别名,就是我的方法.

要么对内层表指定别名,要注意的是,因为内层表名和外层表名相同,所以在条件中,要用表名指定是引用了外层表的字段.


不然就会出错,你正犯了这个错误
pengdali 2003-08-11
  • 打赏
  • 举报
回复
你不要省表名和别名。
pengdali 2003-08-11
  • 打赏
  • 举报
回复
update fact_usrs_app set usrs_total=

(select sum(usrs_add) from fact_usrs_app a

where datediff(day,rtrim(a.date_di),rtrim(fact_usrs_app.date_di))>=0

and fact_usrs_app.domain_id=a.domain_id
and fact_usrs_app.age_id=a.age_id
and fact_usrs_app.prog_type_id=a.prog_type_id
and fact_usrs_app.icp_id=a.icp_id
and fact_usrs_app.bill_type_id=a.bill_type_id)
pengdali 2003-08-11
  • 打赏
  • 举报
回复
update fact_usrs_app set usrs_total=(select sum(usrs_add) from fact_usrs_app a where datediff(day,rtrim(a.date_di),rtrim(fact_usrs_app.date_di))>=0 and domain_id=a.domain_id and age_id=a.age_id and prog_type_id=a.prog_type_id and icp_id=a.icp_id and bill_type_id=a.bill_type_id)
zjcxc 2003-08-11
  • 打赏
  • 举报
回复
试试:
update fact_usrs_app
set usrs_total=(select sum(usrs_add) from fact_usrs_app
where convert(datetime,date_id,120)<=convert(datetime,a.date_id,120) and
domain_id=a.domain_id and age_id=a.age_id and
prog_type_id=a.prog_type_id and
icp_id=a.icp_id and
bill_type_id=a.bill_type_id)
from fact_usrs_app a
hdkkk 2003-08-11
  • 打赏
  • 举报
回复
表结构:
DATE_ID char no 8 no no no Chinese_PRC_CI_AS
DOMAIN_ID decimal no 9 18 0 no (n/a) (n/a) NULL
AGE_ID decimal no 5 3 0 no (n/a) (n/a) NULL
PROG_TYPE_ID char no 6 no no no Chinese_PRC_CI_AS
ICP_ID char no 8 no no no Chinese_PRC_CI_AS
BILL_TYPE_ID decimal no 5 2 0 no (n/a) (n/a) NULL
USRS_TOTAL decimal no 9 10 0 yes (n/a) (n/a) NULL
USRS_NEW decimal no 5 8 0 yes (n/a) (n/a) NULL
USRS_END decimal no 9 18 0 yes (n/a) (n/a) NULL
USRS_ADD decimal no 5 8 0 yes (n/a) (n/a) NULL
————————————————————————————————————
一些数据:
20030101 4141 3 3030 2656 3 1000000 1686 1323 1000000
20030101 4091 3 4085 48 1 1000000 1261 626 1000000
20030101 4137 3 4272 48 3 1000000 1606 1142 1000000
20030101 4038 5 3001 2695 3 1000000 1048 585 1000000
20030102 4172 2 4327 82 1 117 1397 1280 117
20030102 4152 3 1 27 2 1236 1737 501 1236
20030102 4031 1 4096 2656 0 422 1389 967 422
20030102 4337 5 4052 27 3 641 1208 567 641
20030102 1059 5 3048 2695 1 920 1515 595 920
20030102 4280 4 4194 2656 4 361 1842 1481 361
20030102 4047 5 4277 2652 0 -120 1245 1365 -120
20030102 4095 2 3045 2656 1 237 1675 1438 237
20030102 101042 1 4277 31 4 283 1385 1102 283
20030103 4269 5 3051 2695 3 690 1683 993 690
20030103 4365 6 4114 2695 0 310 1321 1011 310
20030103 1054 4 4108 2652 1 365 1738 1373 365
20030103 4225 1 4265 12 0 51 1008 957 51
20030103 4213 3 4190 82 4 889 1459 570 889
20030103 3042 2 4113 2656 1 1040 1962 922 1040
_______________________________________________________________________
我的sql:
update fact_usrs_app
set usrs_total=(select sum(usrs_add) from fact_usrs_app a
where convert(datetime,a.date_id)<=convert(datetime,date_id) and
domain_id=a.domain_id and age_id=a.age_id and
prog_type_id=a.prog_type_id and
icp_id=a.icp_id and
bill_type_id=a.bill_type_id)
zjcxc 2003-08-11
  • 打赏
  • 举报
回复
你在那里用了convert?
zjcxc 2003-08-11
  • 打赏
  • 举报
回复
测试结果

date_id area_id value1 value2
---------- ---------- ----------- ------------
20021201 1 100 100
20021201 2 212 212
20021201 3 263 263
20021202 1 221 321
20021202 2 223 435
20021202 3 163 426
20021203 1 45 366
20021203 2 76 511
20021203 3 567 993

(所影响的行数为 9 行)
hdkkk 2003-08-11
  • 打赏
  • 举报
回复
是不是convert有问题?
zjcxc 2003-08-11
  • 打赏
  • 举报
回复
--借用大力写的表做测试
create table #a(date_id char(10),area_id decimal(8),value1 int,value2 decimal(10))
insert #a values(20021201, 1 , 100, 0)
insert #a values(20021201, 2 , 212,0)
insert #a values( 20021201 , 3 , 263,0)
insert #a values(20021202 , 1 , 221 ,0)
insert #a values( 20021202 , 2 , 223,0)
insert #a values( 20021202 , 3 , 163,0)
insert #a values( 20021203 ,1 , 45 ,0)
insert #a values( 20021203 ,2 , 76,0)
insert #a values( 20021203 ,3, 567,0)

--更新数据
update #a
set value2=(select sum(value1) from #a where date_id<=a.date_id and area_id=a.area_id)
from #a a

select * from #a

drop table #a
hdkkk 2003-08-11
  • 打赏
  • 举报
回复
pengdali(大力 V2.0)

你的是对的。我的表不太一样,不对。我再看看
zjcxc 2003-08-11
  • 打赏
  • 举报
回复
误将and写成了逗号,改正:

update 你的表
set value2=(select sum(value1) from 你的表 where date_id<=a.date_id and area_id=a.area_id)
from 你的表 a
hdkkk 2003-08-11
  • 打赏
  • 举报
回复
用这个肯定可以的.

update 你的表
set value2=(select sum(value1) from 你的表 where date_id<=a.date_id,area_id=a.area_id)
from 你的表 a
---------------------------
语法错误!!!!

pengdali 2003-08-11
  • 打赏
  • 举报
回复
有错吗?
pengdali 2003-08-11
  • 打赏
  • 举报
回复
create table #a(date_id char(10),area_id decimal(8),value1 int,value2 decimal(10))
insert #a values(20021201, 1 , 100, 0)
insert #a values(20021201, 2 , 212,0)
insert #a values( 20021201 , 3 , 263,0)
insert #a values(20021202 , 1 , 221 ,0)
insert #a values( 20021202 , 2 , 223,0)
insert #a values( 20021202 , 3 , 163,0)
insert #a values( 20021203 ,1 , 45 ,0)
insert #a values( 20021203 ,2 , 76,0)
insert #a values( 20021203 ,3, 567,0)


update #a set value2=(select sum(value1) from #a 别名 where 别名.area_id=#a.area_id and 别名.date_id<=#a.date_id)

select * from #a

go
drop table #a

date_id area_id value1 value2
---------- ---------- ----------- ------------
20021201 1 100 100
20021201 2 212 212
20021201 3 263 263
20021202 1 221 321
20021202 2 223 435
20021202 3 163 426
20021203 1 45 366
20021203 2 76 511
20021203 3 567 993

(所影响的行数为 9 行)
hdkkk 2003-08-11
  • 打赏
  • 举报
回复
有啊,就是简单的从value1 拷贝到value2里

:(
zjcxc 2003-08-11
  • 打赏
  • 举报
回复
用这个肯定可以的.

update 你的表
set value2=(select sum(value1) from 你的表 where date_id<=a.date_id,area_id=a.area_id)
from 你的表 a
pengdali 2003-08-11
  • 打赏
  • 举报
回复
update 一个表 set value2=(select sum(value1) from 一个表 别名 where 别名.area_id=一个表.area_id and 别名.date_id<=一个表.date_id)
pengdali 2003-08-11
  • 打赏
  • 举报
回复
update 一个表 set value2=(select sum(value1) from 一个表 tem where tem.area_id=一个表.area_id and tem.date_id<=一个表.date_id)


有问题吗?
Oer 2003-08-11
  • 打赏
  • 举报
回复
to pengdali(大力 V2.0) 你QQ多少,想向你请教!!我QQ:13927506
加载更多回复(7)

22,209

社区成员

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

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