繁体   English   中英

计算sql行,将每行的值添加到下一行

[英]counting sql rows , adding value of every row to the next

我有两列,我想将每一行的值添加到下一行。 我的两列四行的表是这样的:

date           users
2011-01-01      1
2011-02-02      1
2011-03-02      2
2011-04-02      4

我希望用户显示如下,并将每行添加到它的上一行值中:

用户:

1
2
4
8

MS SQL Server是否有执行此操作的功能?

谢谢

在SQL Server 2005及更高版本(未指定版本)中,您可以使用两个CTE(公用表表达式)执行类似的操作-第一个称为UserSequence可以将数据按顺序排列并按顺序进行数字( Sequence )和第二个递归CTE(公用表表达式)来计算运行总计:

;WITH UserSequence AS
(
    SELECT 
        Date, Users, ROW_NUMBER() OVER(ORDER BY Date) as 'Sequence'
    FROM 
        dbo.YourTable
),
UserValues AS
(
  SELECT  
     u.Users AS 'UserValue', u.Date, u.Sequence
  FROM UserSequence u
  WHERE Sequence = 1

  UNION ALL 

  SELECT  
     u.Users + uv.UserValue AS 'UserValue', u.Date, u.Sequence
  FROM UserSequence u
  INNER JOIN UserValues uv ON u.Sequence = uv.Sequence + 1
)
SELECT
    Date, Sequence, UserValue AS 'Users'
FROM 
    UserValues
ORDER BY 
    Sequence

那应该给你这样的输出:

Date                      Sequence    Users
2011-01-01 00:00:00.000       1         1
2011-02-02 00:00:00.000       2         2
2011-03-02 00:00:00.000       3         4
2011-04-02 00:00:00.000       4         8
With cte_Test(Sequence,Name,Value)
As
(
select  ROW_NUMBER() OVER(ORDER BY value) as 'Sequence' ,name,value from test
)

select t1.Name,sum(T2.Value) AS Value from cte_Test t1 
cross JOIN cte_Test t2 where t2.Sequence <= t1.Sequence 
group BY t1.Name
order by 2

您可以按照以下方法进行操作:

set @total_users = 0;
select users, @total_users:=@total_users + users as total_users from tablename;

通过交叉连接可以做到这一点。 如果您的表列按升序排列。

select <T1.Text>,sum(T2.Value) AS 'Commulative Value' from <Your Table name>t1 
cross JOIN <Your Table name> t2 where t2.value<= t1.value
group BY t1.text
order by value

这是ANSI SQL中的解决方案:

SELECT users + lag(users) over (order by users)
FROM your_table
ORDER BY users

适用于PostgreSQL,Oracle,DB2和Teradata(SQL Server确实具有窗口功能,但不幸的是没有lag()函数)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM