powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с SQL
4 сообщений из 4, страница 1 из 1
Помогите с SQL
    #34467836
Kaiden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Никак не могу составить один запрос :(

Есть три таблицы: DOGOVOR - содержит договоры с поставщиками, Nacladnaya - содержит список накладных и R_Order - содержит список расчётных ордеров, которые фиксируют факт оплаты поставки. Упрощенная структура этих таблиц такая:

Код: plaintext
1.
2.
3.
DOGOVOR(n_dogov)
Nacladnaya(n_naclad, n_dogov, summa)
R_order(n_order, n_dogov, summa)

Необходимо посчитать сумму всех сумм накладных по каждому договору (иными словами, суммировать поле summa для всех накладных по каждому договору в отдельности). Затем то же самое проделать с расчётными ордерами. Затем вычесть из сумм накладных суммы расчётных ордеров и получить таким образом таблицу, в которой было бы указано сколько мы еще должны оплатить по каждому договору.

Я написал вот что:
Код: plaintext
1.
2.
3.
SELECT dogovor.n_dogov as n_dogov, sum(nacladnaya.summa) - sum(r_order.summa) as ostatok;
	FROM dogovor, nacladnaya, r_order WHERE (dogovor.n_dogov = nacladnaya.n_dogov);
	AND (dogovor.n_dogov = r_order.n_dogov) GROUP BY dogovor.n_dogov INTO TABLE tmp 

Проблемы всего две:
1) Запрос считает неправильно, такое ощущение, что какие-то поле суммируется несколько раз вместо одного.
2) В запрос не попадают договора, по которым уже есть накладные, но еще нет расчётных ордеров.

Буду очень благодарен, если кто поможет, самому мне с этим не справиться :(

P.S Запрос, на самом деле, немного сложнее, я убрал из него те вещи, которые не вызывают у меня трудностей.
...
Рейтинг: 0 / 0
Помогите с SQL
    #34468020
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если решать задачу "в лоб", то надо делать отдельный запрос для подсчета сумм накладкных, отдельный запрос для подсчета сумм ордеров и уже третьим запросом получать разницу.

Упрощенно, примерно так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
* Сумма накладных
SELECT ;
	n_dogov, ;
	SUM(summa) as sum_nakl ;
FROM Nacladnaya ;
INTO CURSOR curNakl NOFILTER ;
GROUP BY n_dogov

* Сумма ордеров
SELECT ;
	n_dogov, ;
	SUM(summa) as sum_order ;
FROM R_order ;
INTO CURSOR curOrder NOFILTER ;
GROUP BY n_dogov

* Итог
SELECT ;
	NVL(curNakl.n_dogov,curOrder.n_dogov) as n_dogov, ;
	NVL(curNakl.sum_nakl, 0 ) - NVL(curOrder.sum_order, 0 ) as sum_dolg ;
FROM curNakl ;
FULL JOIN curOrder ON curNakl.n_dogov = curOrder.n_dogov ;
INTO CURSOR curResult

* Альтернативный вариант (не проверял для VFP)
* Первые два запроса объединяю по UNION ALL, 
* инвертируя сумму для ордеров
SELECT ;
	n_dogov, ;
	SUM(summa) as summa ;
FROM Nacladnaya ;
INTO CURSOR curNaklOrder NOFILTER ;
GROUP BY n_dogov ;
UNION ALL ;
SELECT ;
	n_dogov, ;
	-SUM(summa) as summa ;
FROM R_order ;
GROUP BY n_dogov

* Итог
SELECT ;
	n_dogov, ;
	SUM(summa) as sum_dolg ;
FROM curNaklOrder ;
INTO CURSOR curResult


Проблема в том, что если по одному договору у тебя 2 накладных и 2 ордера, то в твоем первоначальном запросе сумма накладных и ордеров удвоится. Нельзя напрямую объединять накладные и ордера. Только после исключения "дублей" по коду договора. Это как раз и решается предварительной группировкой.

Кажется, в VFP9 второй вариант можно объединить в один. Т.е. в опции FROM указать первый подзапрос. Но здесь не уверен. Не проверял.
...
Рейтинг: 0 / 0
Помогите с SQL
    #34469049
Kaiden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо, разобрался с первым вариантом.
...
Рейтинг: 0 / 0
Помогите с SQL
    #34469218
Jaroslav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу прощения, кто-нибудь может мне дать полезный совет, а именно: у меня есть база данных (задание:Таблица 1: код института, название института, фамилия ректора
Таблица 2: код института, название специальности, количество принятых на первый курс студентов, количество выпускников. Определить Количество специальностей в каждом институте)
в access состоящая из двух таблиц, я сделал 2 формы для каждой таблицы соответственно в visual basic ,добавил DATA , связал ее с таблицами, также расположил нужное количество textbox для отображения в них данных по каждой таблице, а теперь мне нужно Определить Количество специальностей в каждом институте. Кто-нибудь может подсказать как это сделать?
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Помогите с SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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