Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Abejon Member Откуда: Сообщений: 79 |
Есть таблица транзакций такого вида: 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] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 419 |
Сравниваете приход с расходом. Сильно, но непонятно.
Потом группируете по полям, которые у вас должны быть одинаковые. Сильно, но непонятно. Предлагаю вам начать с описания задачи по русски. Типа Я хочу выбрать ... из таблицы ... с условием ... При расчете балансов удобно думать о расходе, как отрицательном значении при суммировании. |
||||
21 янв 19, 09:46 [21789994] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Kopelly, ну и NULL обработать |
21 янв 19, 12:02 [21790076] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
+ GROUP BY |
21 янв 19, 12:03 [21790079] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4805 |
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] Ответить | Цитировать Сообщить модератору |
Abejon Member Откуда: Сообщений: 79 |
PizzaPizza,
Это номер счёта. По одному и тому же счёту может быть и приход, и расход.
|
||||
21 янв 19, 13:12 [21790173] Ответить | Цитировать Сообщить модератору |
Abejon Member Откуда: Сообщений: 79 |
a_voronin, да, интересный вариант. А мой вариант с JOIN'ами - нерабочий? |
21 янв 19, 13:15 [21790179] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
у вас выпадут обороты если не было обоих движений по счёту |
||
21 янв 19, 13:21 [21790189] Ответить | Цитировать Сообщить модератору |
Asic Member Откуда: Сообщений: 45 |
Abejon, все запросы не рабочие |
21 янв 19, 13:21 [21790191] Ответить | Цитировать Сообщить модератору |
Abejon Member Откуда: Сообщений: 79 |
Asic, почему?! |
21 янв 19, 13:35 [21790205] Ответить | Цитировать Сообщить модератору |
Abejon Member Откуда: Сообщений: 79 |
нужно использовать OUTER JOIN? |
||||
21 янв 19, 13:38 [21790212] Ответить | Цитировать Сообщить модератору |
buser Member Откуда: Санкт-Петербург Сообщений: 4537 |
Abejon, ![]() |
21 янв 19, 13:41 [21790218] Ответить | Цитировать Сообщить модератору |
Asic Member Откуда: Сообщений: 45 |
Abejon, сервер будет возвращать ошибку. Обратите внимание на алиасы таблиц. |
21 янв 19, 13:46 [21790229] Ответить | Цитировать Сообщить модератору |
Abejon Member Откуда: Сообщений: 79 |
Asic, это Вы про st и ct? Спасибо, это очепятка у меня. :-) |
21 янв 19, 13:51 [21790234] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4805 |
Он не оптимальный по производительности. Вам нужен агрегат, а не JOIN |
||
21 янв 19, 16:35 [21790417] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 419 |
Хорошо бы видеть структуру таблицы, а то у меня создается впечатление, что у вас номер счета записывается в разные колонки в зависимости от вида транзакции, а это, однако, странная была бы затея. |
||||
21 янв 19, 19:50 [21790574] Ответить | Цитировать Сообщить модератору |
Abejon Member Откуда: Сообщений: 79 |
a_voronin, ругается на GROUP BY - говорит, синтаксическая ошибка и что после него ждет "AS, ID or QUOTED_ID" Меня смущает, что группировка по результирующему столбцу, а не по одному из обрабатываемых. |
22 янв 19, 12:44 [21790962] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Abejon Member Откуда: Сообщений: 79 |
Kopelly,не понял? |
22 янв 19, 13:02 [21790996] Ответить | Цитировать Сообщить модератору |
Abejon Member Откуда: Сообщений: 79 |
Kopelly,что "a" даёт? |
22 янв 19, 13:05 [21791002] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
|
||
22 янв 19, 13:06 [21791005] Ответить | Цитировать Сообщить модератору |
Abejon Member Откуда: Сообщений: 79 |
Гавриленко Сергей Алексеевич, спасибо, это я понял, что это меняет? Ошибка, действительно, ушла, но почему? |
22 янв 19, 13:13 [21791022] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
вам тоже запрещено msdn читать? |
||
22 янв 19, 13:14 [21791025] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37155 |
|
||
22 янв 19, 13:15 [21791026] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |