powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как посчитать баланс за период
26 сообщений из 26, показаны все 2 страниц
Как посчитать баланс за период
    #39762214
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица транзакций такого вида:
CAccountId, -- приход
DAccountId, -- расход
Amount, -- сумма
Date -- дата

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
	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



И сомневаюсь, верен ли он.
А если не верен, то как правильно?
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762231
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CAccountId, -- приход
DAccountId, -- расход

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

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

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

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

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

При расчете балансов удобно думать о расходе, как отрицательном значении при суммировании.
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762279
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762283
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopelly,

ну и NULL обработать
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762286
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+ GROUP BY
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762293
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abejon,

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762324
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PizzaPizza,

авторСравниваете приход с расходом. Сильно, но непонятно.
Это номер счёта. По одному и тому же счёту может быть и приход, и расход.
авторПотом группируете по полям, которые у вас должны быть одинаковые. Сильно, но непонятно. - это да, одна группировка лишняя.
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762327
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin, да, интересный вариант.
А мой вариант с JOIN'ами - нерабочий?
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762332
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abejona_voronin, да, интересный вариант.
А мой вариант с JOIN'ами - нерабочий?
у вас выпадут обороты если не было обоих движений по счёту
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762333
Asic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abejon,
все запросы не рабочие
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762338
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Asic, почему?!
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762342
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TaPaKAbejona_voronin, да, интересный вариант.
А мой вариант с JOIN'ами - нерабочий?
у вас выпадут обороты если не было обоих движений по счёту
нужно использовать OUTER JOIN ?
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762345
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abejon,
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762353
Asic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Abejon,
сервер будет возвращать ошибку. Обратите внимание на алиасы таблиц.
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762358
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Asic, это Вы про st и ct? Спасибо, это очепятка у меня. :-)
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762448
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abejona_voronin, да, интересный вариант.
А мой вариант с JOIN'ами - нерабочий?

Он не оптимальный по производительности. Вам нужен агрегат, а не JOIN
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762529
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbejonPizzaPizza,

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


Хорошо бы видеть структуру таблицы, а то у меня создается впечатление, что у вас номер счета записывается в разные колонки в зависимости от вида транзакции, а это, однако, странная была бы затея.
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762745
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a_voronin, ругается на GROUP BY - говорит, синтаксическая ошибка и что после него ждет "AS, ID or QUOTED_ID"
Меня смущает, что группировка по результирующему столбцу, а не по одному из обрабатываемых.
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762753
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abejon,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762768
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly,не понял?
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762772
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly,что "a" даёт?
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762774
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbejonKopelly,что "a" даёт?Это alias (то же самое, что написать "as a")
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762785
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич, спасибо, это я понял, что это меняет? Ошибка, действительно, ушла, но почему?
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762788
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbejonГавриленко Сергей Алексеевич, спасибо, это я понял, что это меняет? Ошибка, действительно, ушла, но почему?
вам тоже запрещено msdn читать?
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762789
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AbejonГавриленко Сергей Алексеевич, спасибо, это я понял, что это меняет? Ошибка, действительно, ушла, но почему?Потому что такой синтаксис.
...
Рейтинг: 0 / 0
Как посчитать баланс за период
    #39762790
Abejon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,т.е. обязательно указывать alias в таком случае?
...
Рейтинг: 0 / 0
26 сообщений из 26, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как посчитать баланс за период
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]