Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Бегущая сумма в таблице с одним столбцом  [new]
Shutze
Member

Откуда:
Сообщений: 9
Приветствую ! Столкнулся с такой проблемой. Есть таблица (RunSum) с одним столбцом(Value). Нужно посчитать бегущую сумму этого столбца. Проблема в том что для этого приходится создавать еще один столбец(Number) который использую в Where. Мой запрос выглядит таким образом:

SELECT a.Value, SUM(b.Value) as Summary
FROM RunSum a CROSS JOIN RunSum b
WHERE b.Number <= a.Number
GROUP BY a.Value
ORDER BY a.Value

Столбец Number нужен для того чтобы нумеровать строки. Нужно переписать этот запрос без использования этого столбца. Вместо него нужно использовать Row_Number. Как это сделать ? Варианты с использованием курсора и временной таблицы не подходят изначально.
3 сен 12, 13:37    [13105257]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
Shutze , учитывая
Shutze
с одним столбцом(Value).
а по каким критериям Вы определяете какая сумма "пробежала" раньше?
3 сен 12, 13:48    [13105367]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
Shutze
Member

Откуда:
Сообщений: 9
Не совсем понял вопрос. Берется строка и в условии WHERE b.Number <= a.Number сравнивается. Если условие проходит, то значение Valuе суммируется.
3 сен 12, 13:52    [13105404]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
спрашивалось
Guest
спрашивалось, нумерацию как делаете.
т.е. для таблицы
val
1
2

ваш ответ
val sum
1 1
2 3

или
val sum
2 2
1 3
3 сен 12, 13:58    [13105444]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
это мне непонятна структура таблицы
то Вы говорите
Shutze
Есть таблица (RunSum) с одним столбцом(Value).
потом говорите
Shutze
Столбец Number нужен для того чтобы нумеровать строки. Нужно переписать этот запрос без использования этого столбца

откуда вязлся столбец Number , если в таблице всего один столбец Value?
в общем для начала посмотритте ФАК, может это то, что Вам надо
нарастающий итог
3 сен 12, 14:03    [13105502]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
Shutze
Member

Откуда:
Сообщений: 9
Value Sum
1 1
2 3
3 6
4 10

и т.д.
3 сен 12, 14:05    [13105527]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
Shutze
Member

Откуда:
Сообщений: 9
HandKot
это мне непонятна структура таблицы
откуда вязлся столбец Number , если в таблице всего один столбец Value?
в общем для начала посмотритте ФАК, может это то, что Вам надо
нарастающий итог


Изначально в таблице один столбец Value. Но для того чтобы посчитать сумму мне приходится дополнительно создавать столбец Number потому что я не знаю как сделать без него. Собственно и вопрос в том, как сделать так, чтобы этот столбец не нужно было создавать. В том примере что вы скинули (нарастающий итог) есть столбец ID который является аналогом моего Number. А нужно без него сделать.
3 сен 12, 14:10    [13105574]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
спрашивалось
Guest
т.е. получаете сумму, отсортировав по возрастанию?
declare @t table(val int)
insert @t(val) values (1), (2), (3), (4)

select *,
       (select sum(t1.val)
		from @t t1
		where t1.val <= t2.val 
		) as tot

from @t t2
3 сен 12, 14:18    [13105657]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
спрашивалось
Guest
Shutze
HandKot
это мне непонятна структура таблицы
откуда вязлся столбец Number , если в таблице всего один столбец Value?
в общем для начала посмотритте ФАК, может это то, что Вам надо
нарастающий итог


Изначально в таблице один столбец Value. Но для того чтобы посчитать сумму мне приходится дополнительно создавать столбец Number потому что я не знаю как сделать без него. Собственно и вопрос в том, как сделать так, чтобы этот столбец не нужно было создавать. В том примере что вы скинули (нарастающий итог) есть столбец ID который является аналогом моего Number. А нужно без него сделать.


у всех других id как раз и задает порядок следования значений (кто за кем идет при суммировании)
при отсутствии порядка суммирования ответ не определен, как уже показала выше:

val
1
2

val sum
1 1
2 3

или
val sum
2 2
1 3

если же Вам надо по возрастанию расположить, потом суммировать, см. предыдущий пост
3 сен 12, 14:23    [13105722]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
Shutze
Member

Откуда:
Сообщений: 9
Сортировка идет по возрастанию значения Number а эти значения являются просто номерами строк. Собственно сумма нужна по порядку занесения значений в таблицу. Один человек мне сказал что можно каким-то образом использовать row_number вместо столбца Number. Но вот каким образом ?
3 сен 12, 14:33    [13105873]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
спрашивалось
Guest
для сортировки по порядку занесения надо было предусмотреть то самое поле с номером или с датой внесения занчения.
теперь-то как отличать, что раньше занесли?
при использовании Row_Number() тоже надо указать сортировку, т.е. Row_Number() не даст вам порядок внесения
3 сен 12, 14:43    [13106020]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
Pavel_yu
Member

Откуда:
Сообщений: 79
Shutze,
Задача в принципе неправильная, т.к. у таблицы нет порядка строк.
Row_Number() не подойдет, т.к. требует столбец, по которому будет порядок, а его нет.
Задача возможно решится используя временную таблицу с Identity
Select Identity(int,1,1) as Number , Value
into #RunSum
From RunSum
--а потом запрос
SELECT a.Value, SUM(b.Value) as Summary
FROM #RunSum a CROSS JOIN #RunSum b
WHERE b.Number <= a.Number 
GROUP BY a.Value
ORDER BY a.Value


Возможно, потому-что не всегда физический порядок в таблице будет такой как вы хотите, даже если данные будут добавляться строго последовательно, т.к. структура таблиц не такая уж простая. Например может быть дефрагментация.
Поэтому такой способ в более-менне серьезной системе лучше не использовать.
3 сен 12, 14:57    [13106174]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
спрашивалось
теперь-то как отличать, что раньше занесли?
Вот именно.
Shutze
Собственно сумма нужна по порядку занесения значений в таблицу.
Откуда же теперь его узнать, этот порядок занесения в таблицу?
3 сен 12, 15:01    [13106214]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Pavel_yu
Row_Number() не подойдет, т.к. требует столбец, по которому будет порядок, а его нет.
Задача возможно решится используя временную таблицу с Identity
Да можно и без временной таблицы, используя Row_Number(), только результат будет такой-же - нарастающий итог в произвольном порядке, а не по времени занесения.
3 сен 12, 15:02    [13106232]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
Pavel_yu
Member

Откуда:
Сообщений: 79
alexeyvg,

И что указывать в Row_Number() в предложении order by
3 сен 12, 15:14    [13106326]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
Anddros
Member

Откуда:
Сообщений: 1077
Pavel_yu
И что указывать в Row_Number() в предложении order by
например:
over(order by (select 1))
3 сен 12, 15:20    [13106352]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
Pavel_yu
Member

Откуда:
Сообщений: 79
Anddros,

Спасибо, буду знать
3 сен 12, 15:38    [13106474]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
Shutze
Member

Откуда:
Сообщений: 9
alexeyvg
Откуда же теперь его узнать, этот порядок занесения в таблицу?

Вот кажется и начинают выползать мои пробелы в основах. Когда я пишу Select * from...
Я получаю результат, с набором строк, где каждая строка пронумерована. Разве это не есть порядок внесения данных ?
3 сен 12, 18:46    [13108169]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Anddros
Pavel_yu
И что указывать в Row_Number() в предложении order by
например:
over(order by (select 1))


тогда уже проще сделать так

SELECT Value, Value*(rand()* 100)
FROM RunSum

результат будет одинаковый:)
3 сен 12, 18:50    [13108183]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
спрашивалось
Guest
ну да, номер строки.
только не хранящийся в таблице, а полученный на клиенте согласно запросу.
вон у меня порядок вставки 1,2.
а отдано на клиент как? 2, 1
ну и кто в таблицу был занесен раньше, 1 или 2?

К сообщению приложен файл. Размер - 7Kb
3 сен 12, 18:53    [13108194]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Shutze
alexeyvg
Откуда же теперь его узнать, этот порядок занесения в таблицу?

Вот кажется и начинают выползать мои пробелы в основах. Когда я пишу Select * from...
Я получаю результат, с набором строк, где каждая строка пронумерована. Разве это не есть порядок внесения данных ?


нет, это просто вывод данных в том виде в котором серверу показалось на данный момент быстрее выдать результат.
если запустите запрос завтра ответ будет другой, после завтра опять другой и тд. пока не добавите к запросу order by
3 сен 12, 18:53    [13108195]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
Shutze
alexeyvg
Откуда же теперь его узнать, этот порядок занесения в таблицу?

Вот кажется и начинают выползать мои пробелы в основах. Когда я пишу Select * from...
Я получаю результат, с набором строк, где каждая строка пронумерована. Разве это не есть порядок внесения данных ?
Дополню ответы.
Внутри сервер наваливает данные в кучу, на пустые страницы диска, как ему удобнее по быстродействию. Никаких дат, порядковых номеров не сохраняется. Делается так потому, что сервер не забивает диск ненужными для разработчика данными, оставляя возможность добавить такие данные разрабочику самостоятельно, в зависимости от требований бизнес-логики. Обычно, если надо, делают поля время создания, время последнего обновления и т.д.
3 сен 12, 21:17    [13108559]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31962
alexeyvg
Внутри сервер наваливает данные в кучу, на пустые страницы диска, как ему удобнее по быстродействию.
Вот пример:
create table #t(val int)
go
insert #t values (1),(2),(3),(4),(5)
delete #t where val in (1,2,3)
insert #t values (11),(12),(13),(14),(15)
delete #t where val in (11,12,13)
insert #t values (21),(22),(23)

select * from #t
go
drop table #t

val
-------
21
22
23
4
5
14
15
Числа вставлялись по порядку возрастания, результат селекта видите сами.
3 сен 12, 21:24    [13108588]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
Shutze
Member

Откуда:
Сообщений: 9
Так, значит видимо мне нужно почитать информацию по архитектуре бд. Тогда вопрос в следующем. Как реализовать бегущую сумму для таблицы с одним столбцом ? Группировка не важна, т.е. можно как угодно.
4 сен 12, 13:23    [13111098]     Ответить | Цитировать Сообщить модератору
 Re: Бегущая сумма в таблице с одним столбцом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Shutze
Так, значит видимо мне нужно почитать информацию по архитектуре бд. Тогда вопрос в следующем. Как реализовать бегущую сумму для таблицы с одним столбцом ? Группировка не важна, т.е. можно как угодно.
13106232
4 сен 12, 13:24    [13111110]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить