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

Есть три таблицы: 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
17.04.2007, 23:36
    #34468020
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с SQL
Если решать задачу "в лоб", то надо делать отдельный запрос для подсчета сумм накладкных, отдельный запрос для подсчета сумм ордеров и уже третьим запросом получать разницу.

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

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


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