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

Откуда:
Сообщений: 38
Доброго времени суток!
Помогите с запросом...

Есть 3 таблицы: Firma, Scheta и Oplata

Нужно сделать запрос с выборкой суммы счетов и оплат по фирмам за период. Счетов и оплат может быть несколько в месяце и их кол-во может тоже отличаться, т.е. например у фирмы может быть 3 счёта и 5 оплат в месяц.

Я сделал вот такой запрос:

SELECT F.ID, F.Name,
SUM(S.Summa) as Счета, SUM(O.Summa) as Оплаты
FROM Firma as F
LEFT JOIN Scheta as S on F.ID=S.ID and S.Data>='2015-01-01' and S.Data<='2015-12-31'
LEFT JOIN Oplata as O on F.ID=O.ID and O.Data>='2015-01-01' and O.Data<='2015-12-31'
GROUP BY F.ID, F.Name
ORDER

Результат завышен многократно. Мне кажется, что сумма умножается в N*M раз, где N - кол-во счетов, M - кол-во оплат.
Подскажите, как сделать, чтобы в запросе не было этого многократного увеличения.
5 апр 16, 16:54    [19019882]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
TaPaK
Member

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

F.ID=S.ID это точно верный ключ?
5 апр 16, 16:56    [19019895]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
ospts
Member

Откуда:
Сообщений: 38
Да
5 апр 16, 16:57    [19019901]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
Glory
Member

Откуда:
Сообщений: 104751
ospts
Мне кажется, что сумма умножается в N*M раз, где N - кол-во счетов, M - кол-во оплат.

Правильно кажется, вы же и Scheta и Oplata одновременно соединяете

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

Например,сначала сделать объединение Scheta и Oplata. А потом уже соединение и агрегирование
5 апр 16, 16:59    [19019910]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Или поделить на указанное вами произведение
5 апр 16, 17:02    [19019923]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
ospts
Member

Откуда:
Сообщений: 38
Glory
Правильно кажется, вы же и Scheta и Oplata одновременно соединяете
А как нужно их соединять?

Glory
Например,сначала сделать объединение Scheta и Oplata. А потом уже соединение и агрегирование
Можете показать как именно это сделать?
6 апр 16, 08:02    [19021542]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
ospts
Member

Откуда:
Сообщений: 38
iap
Или поделить на указанное вами произведение
Что-то я сомневаюсь, будет ли это правильное решение...
6 апр 16, 08:04    [19021549]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
Glory
Member

Откуда:
Сообщений: 104751
ospts
Glory
Например,сначала сделать объединение Scheta и Oplata. А потом уже соединение и агрегирование
Можете показать как именно это сделать?

UNION ALL
6 апр 16, 08:17    [19021579]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
ospts
Member

Откуда:
Сообщений: 38
Glory
ospts
Можете показать как именно это сделать?

UNION ALL
А как дальше использовать это объединение?
6 апр 16, 08:32    [19021623]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
_djХомяГ
Guest
ospts
iap
Или поделить на указанное вами произведение
Что-то я сомневаюсь, будет ли это правильное решение...

С точки зрения результата - почему нет
declare @t table 
(id int,qty numeric(20,2))
insert into @t select 1,22.34
union all
select 1,22.34
union all
select 2,11.31
union all
select 2,11.31
union all
select 2,11.31

select id,sum(qty)/(1.0*count(qty))
from @t 
group by id
6 апр 16, 08:34    [19021627]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
Glory
Member

Откуда:
Сообщений: 104751
ospts
А как дальше использовать это объединение?

"А потом уже соединение и агрегирование"
6 апр 16, 08:41    [19021647]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
ospts
Member

Откуда:
Сообщений: 38
А можно на примере показать, как это сделать?
6 апр 16, 09:20    [19021773]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
Glory
Member

Откуда:
Сообщений: 104751
ospts
А можно на примере показать, как это сделать?

Вы же привели изначальный запрос с join-ом и агрегатом
Только join должен быть один и не с таблицей, а с вложенным запросом
6 апр 16, 09:22    [19021780]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
SELECT F.ID, F.Name
,SSumma as Счета
,OSumma as Оплаты
FROM Firma as F
LEFT JOIN (SELECT ID, SUM(Summa) AS SSumma  FROM Scheta WHERE Data >= '2015-01-01' and Data<='2015-12-31' GROUP BY ID) as S on F.ID = S.ID 
LEFT JOIN (SELECT ID, SUM(Summa) AS OSumma  FROM Oplata WHERE Data >= '2015-01-01' and Data<='2015-12-31' GROUP BY ID) as O on F.ID = O.ID 
GROUP BY F.ID, F.Name
6 апр 16, 09:24    [19021785]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с суммированием  [new]
ospts
Member

Откуда:
Сообщений: 38
Спасибо! Теперь всё правильно считается
6 апр 16, 11:06    [19022179]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить