2011-02-12 2 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 (Common Таблицы Expression) для расчета нарастающего итога:

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

+1 для хорошего ответа и хорошо отформатированного SQL –

1

Вот как вы можете это сделать:

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

Это недопустимый SQL. Для какой системы баз данных? –

+0

MySQL. Протестировано, оно работает. –

+0

Существует аналогичная (недокументированная и не гарантированная) техника в SQL Server под названием «quirky update» –

0

Это решение в ANSI SQL:

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

Работает в PostgreSQL, Oracle, DB2 и Teradata (SQL Server имеет функции окна, но, к сожалению, не функция 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

Это возможно через Крест Присоединиться. если столбец таблицы находится в порядке 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 
Смежные вопросы