谁能帮我写个简单的sql语句实现查询,要求如下

逗号xzlhs 2011-10-10 12:41:36
一个已知表a如下:
time num nom
上世纪80年代 30 500
上世纪90年代 20 300
本世纪00年代 50 700
本世纪10年代 40 500

怎么用sql语句查询出一个实现累积数量的表b,如下:
time num mon numA monA
上世纪80年代 30 500 30 500
上世纪90年代 20 300 50 800
本世纪00年代 50 700 100 1500
本世纪10年代 40 500 140 2000
大侠指教啊,用sql server查询语句实现。
...全文
118 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2011-10-10
  • 打赏
  • 举报
回复
先把年代取出來再累加計算
薇薇 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qianjin036a 的回复:]
SQL code

create table tb(dt int,num int,nom int)
insert into tb select 1980,30,500
insert into tb select 1990,20,300
insert into tb select 2000,50,700
insert into tb select 2010,40,500
go
sel……
[/Quote]
这种是最好的处理了
中国风 2011-10-10
  • 打赏
  • 举报
回复
use Tempdb
go
--> -->

if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([time] nvarchar(7),[num] int,[nom] int)
Insert #A
select N'上世纪80年代',30,500 union all
select N'上世纪90年代',20,300 union all
select N'本世纪00年代',50,700 union all
select N'本世纪10年代',40,500
Go
;WITH Cte
AS
(
SELECT * , CASE WHEN LEFT([time],1)=N'上' THEN 1900 WHEN LEFT([time],1)=N'本' THEN 2000 END +CAST(SUBSTRING([time],4,2) AS INT) as 年代 FROM #A
)
Select *,
(SELECT SUM([num]) FROM CTE WHERE 年代<=a.年代) AS numA,
(SELECT SUM([nom]) FROM CTE WHERE 年代<=a.年代) as monA
from CTE AS a

/*
time num nom 年代 numA monA
上世纪80年代 30 500 1980 30 500
上世纪90年代 20 300 1990 50 800
本世纪00年代 50 700 2000 100 1500
本世纪10年代 40 500 2010 140 2000
*/
--小F-- 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 qianjin036a 的回复:]
SQL code

create table tb(dt int,num int,nom int)
insert into tb select 1980,30,500
insert into tb select 1990,20,300
insert into tb select 2000,50,700
insert into tb select 2010,40,500
go
sel……
[/Quote]

可以先做成这样 然后 case when 替代掉
-晴天 2011-10-10
  • 打赏
  • 举报
回复
create table tb(dt int,num int,nom int)
insert into tb select 1980,30,500
insert into tb select 1990,20,300
insert into tb select 2000,50,700
insert into tb select 2010,40,500
go
select dt,num,nom,
(select SUM(num) from tb where dt<=a.dt) numA,
(select SUM(nom) from tb where dt<=a.dt) numB
from tb a
/*
dt num nom numA numB
----------- ----------- ----------- ----------- -----------
1980 30 500 30 500
1990 20 300 50 800
2000 50 700 100 1500
2010 40 500 140 2000

(4 行受影响)

*/
go
drop table tb
-晴天 2011-10-10
  • 打赏
  • 举报
回复
上世纪80年代 之类的,最好直接写成年份,比如 1980,否则,无法用中文来判断谁先谁后.
-晴天 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xzlhsjy 的回复:]
消息 8152,级别 16,状态 14,过程 Stat16BuyTime_Distribute,第 57 行
将截断字符串或二进制数据。
谁知道这种错误一般是什么原因??
[/Quote]

你的列定义得太短了.
估计是要把 yearTime varchar(10),改成:yearTime nvarchar(20),
逗号xzlhs 2011-10-10
  • 打赏
  • 举报
回复
消息 8152,级别 16,状态 14,过程 Stat16BuyTime_Distribute,第 57 行
将截断字符串或二进制数据。
谁知道这种错误一般是什么原因??
中国风 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xzlhsjy 的回复:]

大家帮我看下我写的看怎么改才行,#yearDate_New表里存的数据如下:
id yearTime FNumber FTotalPrice
1 上世纪80年代 30 500
2 上世纪90年代 20 300
3 本世纪00年代 50 700
4 本世纪10年代 40 500
我写的累加的代……
[/Quote]
可參照4樓方法,SQL2000時


use Tempdb
go
--> -->

if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([time] nvarchar(7),[num] int,[nom] int)
Insert #A
select N'上世纪80年代',30,500 union all
select N'上世纪90年代',20,300 union all
select N'本世纪00年代',50,700 union all
select N'本世纪10年代',40,500
Go

IF OBJECT_ID('Tempdb..#') IS NOT NULL
DROP TABLE #
SELECT * , CASE WHEN LEFT([time],1)=N'上' THEN 1900 WHEN LEFT([time],1)=N'本' THEN 2000 END +CAST(SUBSTRING([time],4,2) AS INT) as 年代 INTO # FROM #A

Select *,
(SELECT SUM([num]) FROM # WHERE 年代<=a.年代) AS numA,
(SELECT SUM([nom]) FROM # WHERE 年代<=a.年代) as monA
from # AS a

/*
time num nom 年代 numA monA
上世纪80年代 30 500 1980 30 500
上世纪90年代 20 300 1990 50 800
本世纪00年代 50 700 2000 100 1500
本世纪10年代 40 500 2010 140 2000
*/
-晴天 2011-10-10
  • 打赏
  • 举报
回复
select b.yearTime,sum(a.FNumber),sum(a.FTotalPrice)
from #yearDate_New a inner join (select id,yearTime,FNumber,FTotalPrice from #yearDate_New) b on a.id<=b.id
where (b.id<=@c)
GROUP BY b.id,b.yeartime
逗号xzlhs 2011-10-10
  • 打赏
  • 举报
回复
大家帮我看下我写的看怎么改才行,#yearDate_New表里存的数据如下:
id yearTime FNumber FTotalPrice
1 上世纪80年代 30 500
2 上世纪90年代 20 300
3 本世纪00年代 50 700
4 本世纪10年代 40 500
我写的累加的代码如下,但是出现(消息 8120,级别 16,状态 1,过程 Stat16BuyTime_Distribute,第 68 行
选择列表中的列 'b.yearTime' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。)的错误。
declare @c int
set @c = (select top 1 id from #yearDate_New order by id desc)
create table #yearDateA(yearTime varchar(10),FNumberA int,FTotalPriceA numeric(18,2))
insert into #yearDateA
select b.yearTime,sum(a.FNumber),sum(a.FTotalPrice)
from #yearDate_New a inner join (select id,yearTime,FNumber,FTotalPrice from #yearDate_New) b on a.id<=b.id
where (b.id<=@c)
GROUP BY b.id
ORDER BY b.id

怎么去改进?

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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