一个已知表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查询语句实现。

解决方案 »

  1.   

    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
      

  2.   


    可以先做成这样 然后 case when 替代掉
      

  3.   

    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
    */
      

  4.   

    大家帮我看下我写的看怎么改才行,#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
    怎么去改进?
      

  5.   

    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
      

  6.   

    可參照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
    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
    */
      

  7.   

    消息 8152,级别 16,状态 14,过程 Stat16BuyTime_Distribute,第 57 行
    将截断字符串或二进制数据。
    谁知道这种错误一般是什么原因??
      

  8.   


    你的列定义得太短了.
    估计是要把 yearTime varchar(10),改成:yearTime nvarchar(20),