2011-02-12 3 views
0

두 열이 있고 각 행의 값을 다음 행에 추가하려고합니다. 두 개의 열 4 행 내 표는 같은 수 있습니다 :SQL 행을 계산하여 다음 행마다 값 추가

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에서이를 수행 할 수있는 기능이 있습니까?

감사

다음
+0

죄송합니다. 코드 태그로 처리 했어야합니다. – m0j1

답변

2

SQL Server 2 005와 그 이상 (당신이 가지고있는 버전을 지정하지 않았다면), 두 개의 CTE (Common Table Expression) - UserSequence이라는 첫 번째 코드를 사용하여 데이터를 주문에 넣고 일련 번호 (Sequence)를 부여하면됩니다.), 및 제 재귀 CTE (공통 테이블 식)는 누적 합계를 계산 :

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 
+1

+1 좋은 답변과 올바른 형식의 SQL –

1

당신이 그것을 할 수있는 방법은 다음과 같습니다

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

PostgreSQL을, 오라클의 작품, DB2 및 테라 데이타 (SQL 서버 :

set @total_users = 0; 
select users, @total_users:[email protected]_users + users as total_users from tablename; 
+0

이것은 유효한 SQL이 아닙니다. 이것을위한 데이터베이스 시스템은 무엇입니까? –

+0

MySQL. 그것을 테스트, 작동합니다. –

+0

"quirky update"라는 SQL 서버와 유사한 (문서화되지 않은 보증) 기술이 있습니다 –

0

이 ANSI의 SQL의 솔루션입니다 불행히도 lag() 함수가 아닙니다.)

+0

내 프로젝트는 Microsoft SQL에 있습니다 – m0j1

+0

이 필수 정보를 포함하도록 태그와 질문을 업데이트했습니다 –

2
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 
1

이 크로스를 통해 가능하다 : 당신이 같은 출력 무언가를 제공해야

;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 

어울리다. 테이블 컬럼이 Asc 순서에있는 경우.

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 
관련 문제