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

Откуда:
Сообщений: 76
Есть таблица транзакций такого вида:
CAccountId, -- приход
DAccountId, -- расход
Amount, -- сумма
Date -- дата

Нужно подсчитать баланс за определённый период. Написал такой запрос:

	SELECT 
		dt.DAccountId AS AccountID, SUM(dt.AmountBC) - SUM(ct.AmountBC) AS Balance
	FROM
		[Transactions] AS dt
		JOIN [Transactions] AS st ON dt.DAccountId = ct.CAccountId
	GROUP BY
		dt.DAccountId, ct.CAccountId
	HAVING
		dt.Date BETWEEN @StartDate AND @FinishDate AND cd.Date BETWEEN @StartDate AND @FinishDate


И сомневаюсь, верен ли он.
А если не верен, то как правильно?
21 янв 19, 08:33    [21789965]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
PizzaPizza
Member

Откуда:
Сообщений: 367
CAccountId, -- приход
DAccountId, -- расход

JOIN [Transactions] AS st ON dt.DAccountId = ct.CAccountId

Сравниваете приход с расходом. Сильно, но непонятно.

GROUP BY dt.DAccountId, ct.CAccountId

Потом группируете по полям, которые у вас должны быть одинаковые. Сильно, но непонятно.

Предлагаю вам начать с описания задачи по русски. Типа

Я хочу выбрать ...
из таблицы ...
с условием ...

При расчете балансов удобно думать о расходе, как отрицательном значении при суммировании.
21 янв 19, 09:46    [21789994]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
SELECT 
		isnull(dt.DAccountId,ct .DAccountId) AS AccountID, SUM(dt.AmountBC) - SUM(ct.AmountBC) AS Balance
	FROM
		(Select DAccountId, sum(AmountBC) as AmountBC 
                   From [Transactions]
                  Where Date BETWEEN @StartDate AND @FinishDate ) AS dt
	FULL JOIN 
		(Select CAccountId, sum(AmountBC) as AmountBC 
                   From [Transactions]
                  Where Date BETWEEN @StartDate AND @FinishDate ) AS ct 
	  ON dt.DAccountId = ct.CAccountId
21 янв 19, 11:55    [21790070]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Kopelly,

ну и NULL обработать
21 янв 19, 12:02    [21790076]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
+ GROUP BY
21 янв 19, 12:03    [21790079]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4721
Abejon,

А почему бы вот так не написать?

SELECT AccountID, SUM(Balance) FROM 
(
	SELECT 
		dt.DAccountId AS AccountID, dt.AmountBC AS Balance
	FROM
		[Transactions] AS dt
	WHERE dt.Date BETWEEN @StartDate AND @FinishDate

	UNION ALL

	SELECT 
		ct.DAccountId AS AccountID, -ct.AmountBC AS Balance
	FROM
		[Transactions] AS dt
	WHERE cd.Date BETWEEN @StartDate AND @FinishDate
) 
GROUP BY AccountID


Сообщение было отредактировано: 21 янв 19, 13:04
21 янв 19, 12:17    [21790097]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Abejon
Member

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

автор
Сравниваете приход с расходом. Сильно, но непонятно.

Это номер счёта. По одному и тому же счёту может быть и приход, и расход.
автор
Потом группируете по полям, которые у вас должны быть одинаковые. Сильно, но непонятно.
- это да, одна группировка лишняя.
21 янв 19, 13:12    [21790173]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Abejon
Member

Откуда:
Сообщений: 76
a_voronin, да, интересный вариант.
А мой вариант с JOIN'ами - нерабочий?
21 янв 19, 13:15    [21790179]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Abejon
a_voronin, да, интересный вариант.
А мой вариант с JOIN'ами - нерабочий?

у вас выпадут обороты если не было обоих движений по счёту
21 янв 19, 13:21    [21790189]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Asic
Member

Откуда:
Сообщений: 45
Abejon,
все запросы не рабочие
21 янв 19, 13:21    [21790191]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Abejon
Member

Откуда:
Сообщений: 76
Asic, почему?!
21 янв 19, 13:35    [21790205]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Abejon
Member

Откуда:
Сообщений: 76
TaPaK
Abejon
a_voronin, да, интересный вариант.
А мой вариант с JOIN'ами - нерабочий?

у вас выпадут обороты если не было обоих движений по счёту

нужно использовать OUTER JOIN?
21 янв 19, 13:38    [21790212]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
Abejon, Картинка с другого сайта.
21 янв 19, 13:41    [21790218]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Asic
Member

Откуда:
Сообщений: 45
Abejon,
сервер будет возвращать ошибку. Обратите внимание на алиасы таблиц.
21 янв 19, 13:46    [21790229]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Abejon
Member

Откуда:
Сообщений: 76
Asic, это Вы про st и ct? Спасибо, это очепятка у меня. :-)
21 янв 19, 13:51    [21790234]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4721
Abejon
a_voronin, да, интересный вариант.
А мой вариант с JOIN'ами - нерабочий?


Он не оптимальный по производительности. Вам нужен агрегат, а не JOIN
21 янв 19, 16:35    [21790417]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
PizzaPizza
Member

Откуда:
Сообщений: 367
Abejon
PizzaPizza,

автор
Сравниваете приход с расходом. Сильно, но непонятно.

Это номер счёта. По одному и тому же счёту может быть и приход, и расход.


Хорошо бы видеть структуру таблицы, а то у меня создается впечатление, что у вас номер счета записывается в разные колонки в зависимости от вида транзакции, а это, однако, странная была бы затея.
21 янв 19, 19:50    [21790574]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Abejon
Member

Откуда:
Сообщений: 76
a_voronin, ругается на GROUP BY - говорит, синтаксическая ошибка и что после него ждет "AS, ID or QUOTED_ID"
Меня смущает, что группировка по результирующему столбцу, а не по одному из обрабатываемых.
22 янв 19, 12:44    [21790962]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Kopelly
Member

Откуда: Красноярск
Сообщений: 289
Abejon,

SELECT AccountID, SUM(Balance) FROM 
(
	SELECT 
		dt.DAccountId AS AccountID, dt.AmountBC AS Balance
	FROM
		[Transactions] AS dt
	WHERE dt.Date BETWEEN @StartDate AND @FinishDate

	UNION ALL

	SELECT 
		ct.DAccountId AS AccountID, -ct.AmountBC AS Balance
	FROM
		[Transactions] AS dt
	WHERE cd.Date BETWEEN @StartDate AND @FinishDate
)  a
GROUP BY AccountID
22 янв 19, 12:50    [21790974]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Abejon
Member

Откуда:
Сообщений: 76
Kopelly,не понял?
22 янв 19, 13:02    [21790996]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Abejon
Member

Откуда:
Сообщений: 76
Kopelly,что "a" даёт?
22 янв 19, 13:05    [21791002]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36968
Abejon
Kopelly,что "a" даёт?
Это alias (то же самое, что написать "as a")
22 янв 19, 13:06    [21791005]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Abejon
Member

Откуда:
Сообщений: 76
Гавриленко Сергей Алексеевич, спасибо, это я понял, что это меняет? Ошибка, действительно, ушла, но почему?
22 янв 19, 13:13    [21791022]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Abejon
Гавриленко Сергей Алексеевич, спасибо, это я понял, что это меняет? Ошибка, действительно, ушла, но почему?

вам тоже запрещено msdn читать?
22 янв 19, 13:14    [21791025]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать баланс за период  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36968
Abejon
Гавриленко Сергей Алексеевич, спасибо, это я понял, что это меняет? Ошибка, действительно, ушла, но почему?
Потому что такой синтаксис.
22 янв 19, 13:15    [21791026]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить