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

Откуда:
Сообщений: 13
Добрый день уважаемые форумчане, подскажите пожалуйста, как составить правильный запрос. Не могу понять в какую сторону копать.

В запросе используется 5 нижеуказанных таблиц :

DOGOVOR
ID_DOG
NUMB
DATE_
ID_CLIENT

ZAKAZ
ID_ZAKAZ
ID_DOG
NAME

WORKS
ID_WORK
ID_ZAKAZ
NAME
DATE_
AKT
SF
COST
KOLVO
SUM_

PRIHOD
ID_PRIHOD
ID_DOG
BILL
DATE_
SUM_

CLIENTS
ID_CLIENT
NAME

Нужно, чтобы запрос выводил список договоров, с полями: № договора, дата договора, наименование клиента и самое главное он должен выводить (сумму всех приходов)-(сумму всех работ(затрат)) по каждому договору. Примерно вот так:

0001/14..... 2014-01-13.....ООО "Клиент"....-900000
0002/14.....2014-02-14.....ИП Рога............-95000

Мой запрос выглядит следующим образом :

select 

DOGOVOR.NUMB AS '№ Договора',
DOGOVOR.DATE_ AS 'Дата договора',
CLIENTS.NAME AS 'Клиент',
(SUM(DISTINCT PRIHOD.SUM_)-SUM(DISTINCT WORKS.SUM_)) AS 'Сумма'

from DOGOVOR

INNER join CLIENTS on CLIENTS.ID_CLIENT = DOGOVOR.ID_CLIENT
INNER join ZAKAZ on ZAKAZ.ID_DOG = DOGOVOR.ID_DOG
INNER join WORKS on WORKS.ID_ZAKAZ = ZAKAZ.ID_ZAKAZ
INNER join PRIHOD on PRIHOD.ID_DOG = DOGOVOR.ID_DOG

GROUP BY DOGOVOR.NUMB,DOGOVOR.DATE_,CLIENTS.NAME


Проблема заключается в том, что используя в запросе 'DISTINCT' я исключаю суммирование одинаковых чисел по приходам и затратам даже по разным договорам, что недопустимо. А без 'DISTINCT' я получаю суммирование чисел умноженное на количество записей по каждому договору, что тоже неправильно. Нужно чтобы запрос выводил корректный баланс работ и приходов по каждому договору.

Как быть?

Прошу Вашей помощи!
14 янв 14, 09:37    [15411709]     Ответить | Цитировать Сообщить модератору
 Re: Проблема в составлении запроса по расчету суммы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31437
NonameXZ
Как быть?
Укажите версию сиквела.
NonameXZ
А без 'DISTINCT' я получаю суммирование чисел умноженное на количество записей по каждому договору, что тоже неправильно. Нужно чтобы запрос выводил корректный баланс работ и приходов по каждому договору.
Непонятна модель данных.

По договору какие записи дублируются, откуда ошибка? Непонятно назначение таблиц периодов и работ.

В лоб задача решается просто, коррелированными запросами, как то так:
SELECT 
DOGOVOR.NUMB AS '№ Договора',
DOGOVOR.DATE_ AS 'Дата договора',
CLIENTS.NAME AS 'Клиент',
(
	(SELECT SUM(PRIHOD.SUM_) FROM PRIHOD WHERE PRIHOD.ID_DOG = DOGOVOR.ID_DOG) - 
	(SELECT SUM(WORKS.SUM_) FROM WORKS INNER join ZAKAZ on WORKS.ID_ZAKAZ = ZAKAZ.ID_ZAKAZ WHERE ZAKAZ.ID_DOG = DOGOVOR.ID_DOG)
) AS 'Сумма'

from DOGOVOR
INNER join CLIENTS on CLIENTS.ID_CLIENT = DOGOVOR.ID_CLIENT
GROUP BY DOGOVOR.NUMB,DOGOVOR.DATE_,CLIENTS.NAME

Но можно написать и по другому, зная логическую модель и версию сиквела
14 янв 14, 09:59    [15411769]     Ответить | Цитировать Сообщить модератору
 Re: Проблема в составлении запроса по расчету суммы  [new]
П-Л
Guest
Один договор - много заказов.
Один заказ - много работ (расходов), поэтому и перемножилось.

1. Посчитать отдельно приходы с агрегацией до договора, отдельно расходы с агрегацией до договора, потом эти два наболра сджоинить и получить сальдо.

SELECT 
   d.ID_DOG, p.PRIHOD, r.RASHOD, SALDO = p.PRIHOD - r.RASHOD
FROM
(   
SELECT 
   d.ID_DOG, SUM(p.SUM_) AS PRIHOD
FROM 
   DOGOVOR d
   INNER JOIN PRIHOD ON p.ID_DOG = d.ID_DOG
GROUP BY d.ID_DOG   
) p
INNER JOIN 
(
SELECT 
   d.ID_DOG, SUM(z.SUM_) AS RASHOD
FROM 
   DOGOVOR d
   INNER JOIN ZAKAZ z ON z.ID_DOG = d.ID_DOG
   INNER JOIN WORKS w ON w.ID_ZAKAZ = z.ID_ZAKAZ
GROUP BY d.ID_DOG   
) r ON p.ID_
DOG = r.ID_DOG


2. Вытащить суммы вложенными запросами.

select 
   DOGOVOR.NUMB AS '№ Договора',
   DOGOVOR.DATE_ AS 'Дата договора',
   CLIENTS.NAME AS 'Клиент',
   (
      SELECT SUM(PRIHOD.SUM_) FROM PRIHOD WHERE PRIHOD.ID_DOG = DOGOVOR.ID_DOG 
   ) 
   - (
      SELECT SUM(WORKS.SUM_) FROM WORKS WHERE WORKS.ID_ZAKAZ IN (SELECT ID_ZAKAZ FROM ZAKAZ WHERE ZAKAZ.ID_DOC = DOGOVOR.ID_DOG)
   ) AS 'Сумма'
from 
   DOGOVOR
   inner join CLIENTS on CLIENTS.ID_CLIENT = DOGOVOR.ID_CLIENT
   inner join ZAKAZ on ZAKAZ.ID_DOG = DOGOVOR.ID_DOG
14 янв 14, 10:08    [15411801]     Ответить | Цитировать Сообщить модератору
 Re: Проблема в составлении запроса по расчету суммы  [new]
NonameXZ
Member

Откуда:
Сообщений: 13
П-Л,

Огромное спасибо!
Проблема решена!
14 янв 14, 10:15    [15411823]     Ответить | Цитировать Сообщить модератору
 Re: Проблема в составлении запроса по расчету суммы  [new]
iap
Member

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

а если "суммирование чисел умноженное на количество записей по каждому договору"
делить на "количество записей по каждому договору"?
14 янв 14, 10:44    [15411925]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить