一个已知表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查询语句实现。
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查询语句实现。
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
可以先做成这样 然后 case when 替代掉
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
*/
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
怎么去改进?
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
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
GoIF 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 #ASelect *,
(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
*/
将截断字符串或二进制数据。
谁知道这种错误一般是什么原因??
你的列定义得太短了.
估计是要把 yearTime varchar(10),改成:yearTime nvarchar(20),