Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как посчитать баланс за период / 25 сообщений из 26, страница 1 из 2
21.01.2019, 08:33
    #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
21.01.2019, 09:46
    #39762231
PizzaPizza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать баланс за период
CAccountId, -- приход
DAccountId, -- расход

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

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

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

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

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

При расчете балансов удобно думать о расходе, как отрицательном значении при суммировании.
...
Рейтинг: 0 / 0
21.01.2019, 11:55
    #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
21.01.2019, 12:02
    #39762283
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать баланс за период
Kopelly,

ну и NULL обработать
...
Рейтинг: 0 / 0
21.01.2019, 12:03
    #39762286
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать баланс за период
+ GROUP BY
...
Рейтинг: 0 / 0
21.01.2019, 12:17
    #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
21.01.2019, 13:12
    #39762324
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать баланс за период
PizzaPizza,

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

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

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


Хорошо бы видеть структуру таблицы, а то у меня создается впечатление, что у вас номер счета записывается в разные колонки в зависимости от вида транзакции, а это, однако, странная была бы затея.
...
Рейтинг: 0 / 0
22.01.2019, 12:44
    #39762745
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать баланс за период
a_voronin, ругается на GROUP BY - говорит, синтаксическая ошибка и что после него ждет "AS, ID or QUOTED_ID"
Меня смущает, что группировка по результирующему столбцу, а не по одному из обрабатываемых.
...
Рейтинг: 0 / 0
22.01.2019, 12:50
    #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
22.01.2019, 13:02
    #39762768
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать баланс за период
Kopelly,не понял?
...
Рейтинг: 0 / 0
22.01.2019, 13:05
    #39762772
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать баланс за период
Kopelly,что "a" даёт?
...
Рейтинг: 0 / 0
22.01.2019, 13:06
    #39762774
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать баланс за период
AbejonKopelly,что "a" даёт?Это alias (то же самое, что написать "as a")
...
Рейтинг: 0 / 0
22.01.2019, 13:13
    #39762785
Abejon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать баланс за период
Гавриленко Сергей Алексеевич, спасибо, это я понял, что это меняет? Ошибка, действительно, ушла, но почему?
...
Рейтинг: 0 / 0
22.01.2019, 13:14
    #39762788
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать баланс за период
AbejonГавриленко Сергей Алексеевич, спасибо, это я понял, что это меняет? Ошибка, действительно, ушла, но почему?
вам тоже запрещено msdn читать?
...
Рейтинг: 0 / 0
22.01.2019, 13:15
    #39762789
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как посчитать баланс за период
AbejonГавриленко Сергей Алексеевич, спасибо, это я понял, что это меняет? Ошибка, действительно, ушла, но почему?Потому что такой синтаксис.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как посчитать баланс за период / 25 сообщений из 26, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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