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

Откуда:
Сообщений: 76
Добрый день. Кому не сложно, помогите написать расчет балланса. Думаю это можно сделать с выражением WITH , но не могу понять как.
CREATE TABLE #sales (userid INT , amount INT,[date] date)
CREATE TABLE #balance (userid INT , amount INT,[date] date)
INSERT INTO #sales
SELECT 1,1000,'2015-07-01'
UNION
SELECT 1,900,'2015-07-02'
UNION
SELECT 1,700,'2015-07-04'
INSERT INTO #balance
( userid, amount, date )
VALUES ( 1, -- userid - int
10000, -- amount - int
'2015-06-30' -- date - date
)

нужно просчитать так что бы для каждого юзера, на каждый день считался балланс по след формуле: баланс с прошлого дня - продажи сегодня.

userid amount date
1 9000 '2015-07-01'
1 8100 '2015-07-02'
1 8100 '2015-07-03'
1 7400 '2015-07-04'
31 июл 15, 15:52    [17960814]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Задача как-то слабо структурирована... У юзера может быть только один баланс в каждый конкретный момент времени? Баланс должен уменьшаться постоянно?
31 июл 15, 16:02    [17960898]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
bananazury
Member

Откуда:
Сообщений: 76
ну по логике это как лог того, какой был балланс у юзера на конец каждого дня.Соответственно на дату-балланс. Т.е. у нас есть начальный балланс (один) на начальную дату, для каждого юзера, и есть продажи за каждый день.
31 июл 15, 16:05    [17960926]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @sales TABLE (userid INT, amount INT, [date] DATE, PRIMARY KEY (userid, [date]))
DECLARE @balance TABLE (userid INT PRIMARY KEY, amount INT, [date] date)

INSERT INTO @sales
SELECT 1,1000,'2015-07-01'
UNION ALL
SELECT 1,900,'2015-07-02'
UNION ALL
SELECT 1,700,'2015-07-04'

INSERT INTO @balance (userid, amount, [date] )
VALUES (1, 10000, '2015-06-30')

SELECT s.[date], val = b.amount - SUM(s.amount) OVER (PARTITION BY b.userid ORDER BY s.[date] RANGE UNBOUNDED PRECEDING)
FROM @balance b
JOIN @sales s ON b.userid = s.userid AND b.[date] < s.[date] 


протяжку данных по дням - задача тривиальная... просто посмотрите в гугле.
31 июл 15, 16:18    [17961000]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8353
Рассчитайте за каждый день и сложите в таблицу.
31 июл 15, 16:37    [17961136]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8353
Даже лучше так - по каждому рассчитайте начальный баланс и поместите в таблицу.
Затем с нужной периодичностью обновляйте суммы в таблице с учетом уже вычисленной в этой таблице, прихода и расхода за последнее время.
31 июл 15, 16:39    [17961149]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос  [new]
bananazury
Member

Откуда:
Сообщений: 76
AlanDenton Спасибо!
31 июл 15, 17:00    [17961264]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить