Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.04;
Скачать: CL | DM;

Вниз

Как построить запрос   Найти похожие ветки 

 
andrey-406   (2007-02-14 10:55) [0]

Есть 4 таблицы: организации (contragents), контракты (contracts) приложения(Apps),акты(Akts),платежи(Pays). Контракты связаны с огранизациями по полю contrag_id, а приложения,акты,платежи связаны с контрактами по полю contr_id. Приложения, платежи,акты имеют поле суммы(summa). Необходимо построить запрос,который выводит
номер контракта,номер организации, с кот. он связан и главное запрос должен выводить общие суммы всех актов,платежей,приложений,связанных с этим контрактом. И у меня никак не получается это сделать, может кто поможет?
Вот я пытался написать подобный запрос для одних только платежей,но почему то сумма получается пустая

SELECT org.contr_id,contr.contr_id,(SELECT SUM(p.summa) FROM pays p WHERE p.contr_id = contr.contr_id) as sumpay
 
FROM  Contragents Org, Contracts contr
   
WHERE (contr.contrag_id = org.contr_id)


 
Sergey13 ©   (2007-02-14 11:02) [1]

Почитай в хелпе (LocalSQL.hlp) про Group by.


 
andrey-406   (2007-02-14 11:20) [2]

не совем понял, а как может помочь GROUP BY. По каким полям группировать данные,ведь надо в одном запросе вывести общие суммы и платежей,и актов и контрактов.Если бы что то одно,проблем бы не было. А по поводу вложенного запроса, там вроде тоже нечего группировать, но я не пойму почему он не работает


 
Sergey13 ©   (2007-02-14 11:26) [3]

SELECT org.contr_id,contr.contr_id,SUM(p.summa),SUM(Ak.summa),SUM(Ap.summa)
FROM  Contragents Org, Contracts contr, pays p, Akts Ak, Apps Ap
WHERE contr.contrag_id = org.contr_id
and p.contr_id = contr.contr_id
and Ak.contr_id = contr.contr_id
and Ap.contr_id = contr.contr_id
Group by org.contr_id,contr.contr_id


 
andrey-406   (2007-02-14 11:34) [4]

так я давно писал,но оно выдает суммы больше чем надо. Ведь перекрестное соединение таблиц дает ВСЕ наборы значений, т.е. для данной пары контракт-контрагент будет сформировано несколько записей с одинаковыми актами или платежами. В том то и дело что надо как то иначе...


 
andrey-406   (2007-02-14 11:37) [5]

вот если бы можно было например использовать в функции суммы DISTINCT не для самих сумм,а для значений ключа


 
Sergey13 ©   (2007-02-14 11:43) [6]

> [4] andrey-406   (14.02.07 11:34)
> так я давно писал,но оно выдает суммы больше чем надо.
Значит с ошибкой писал.
Кстати там надо поля вроде исправить.
SELECT org.contrag_id,contr.contr_id
ну и в груп бай соответственно


 
fd979 ©   (2007-02-14 11:50) [7]

SELECT Org.contr_id, Contr.contr_id,
(Select Sum(p.summa) from Pays P Where p.contr_id = org.contr_id Group By P.Contr_Id) as P_Summa,
(Select Sum(AK.summa) From Akts Ak Where AK.contr_id = org.contr_id Group By AK.Contr_Id) as AK_Summa,
(Select Sum(AP.summa) FROM Apps Ap Where AP.contr_id = org.contr_id Group By AP.Contr_Id) as AP_Summa,
FROM  Contragents Org
WHERE contr.contrag_id = org.contr_id
Group by org.contr_id,contr.contr_id


Может так? Проверь наверно есть какая-то ошибка у меня. Но в общем и целом работать должно... А может и нет


 
Andrey-406   (2007-02-14 12:00) [8]

А оно не работает,такое впечатление что в подзапросе недоступно значение org.contr_id,в результате получаются пустые значения,а вот если подставить число например 1 ,то суммы считаются


 
fd979 ©   (2007-02-14 12:11) [9]


SELECT Org.contr_id, Contr.contr_id,
IIF(((Select Sum(p.summa) from Pays P Where p.contr_id = org.contr_id Group By P.Contr_Id)), 0, (Select Sum(p.summa) from Pays P Where p.contr_id = org.contr_id Group By P.Contr_Id)) as P_Summa,

IIF(((Select Sum(AK.summa) From Akts Ak Where AK.contr_id = org.contr_id Group By AK.Contr_Id)) is Null, 0, ((Select Sum(AK.summa) From Akts Ak Where AK.contr_id = org.contr_id Group By AK.Contr_Id))) as AK_Summa,
IIF(((Select Sum(AP.summa) FROM Apps Ap Where AP.contr_id = org.contr_id Group By AP.Contr_Id)) is Null, 0, ((Select Sum(AP.summa) FROM Apps Ap Where AP.contr_id = org.contr_id Group By AP.Contr_Id))) as AP_Summa
FROM  Contragents Org
WHERE contr.contrag_id = org.contr_id
Group by org.contr_id,contr.contr_id


 
fd979 ©   (2007-02-14 12:11) [10]

а так?


 
ЮЮ ©   (2007-02-14 12:17) [11]


> А оно не работает,такое впечатление


Правильное впечатление. Особенно, если это ВDE и LocalSQL. На таком запросе и сервер надолго загрузится :)

SELECT  contr_id , SUM(summa) summa FROM pays Group BY contr_id - в Local View, а затем уже связывать с дугими таблицами


 
Andrey-406   (2007-02-14 12:23) [12]

увы, написано, что такое свойство не поддерживается.


 
fd979 ©   (2007-02-14 12:46) [13]

Что не поддерживается? IIF?
А нет заменителя? Что-нибудь да должно быть


 
Andrey-406   (2007-02-14 12:51) [14]

А что делает IIF? Что то я такой функции не встречал...


 
fd979 ©   (2007-02-14 12:56) [15]

IIf(expr, truepart, falsepart)

expr - проверяет на истинность или ложность
truepart - выполняется, если True
falsepart - выполняется, если False

Применимо к твоей задаче проверяется есть ли вообще такие данные или нет. Если нет то возвращается 0, если есть тогда сами данные (то есть сумма).


 
Andrey-406   (2007-02-14 13:40) [16]

Так данные есть,запрос не видит имя таблицы из главного запроса


 
fd979 ©   (2007-02-14 14:28) [17]

выставь базу


 
Andrey-406   (2007-02-14 15:07) [18]

то есть?
вот запрос:

SELECT org.contr_id,contr.contr_id,(SELECT SUM(p.summa) FROM pays p WHERE p.contr_id = contr.contr_id) as sumpay

FROM  Contragents Org, Contracts contr
   
WHERE (contr.contrag_id = org.contr_id)

а как это ее выставить?


 
Клара   (2007-02-14 15:50) [19]


> Andrey-406

Попробуй создать запрос с группировкой для таблицы платежи (суммируй их),  а затем на основе этого запроса создай запрос с соединением, т.е. соедини все нужные таблицы.


 
Andrey-406   (2007-02-14 18:04) [20]

Я не очень хорошо знаю SQL, а как это можно объединять запросы?


 
Клара   (2007-02-15 09:33) [21]


> Andrey-406

Сделай так:
1. Создай запрос с группировкой по актам
SELECT акты.contr_id, Sum(акты.summa) AS [Sum-summa]
FROM акты
GROUP BY акты.contr_id;
2. создай запрос с группировкой по платежам
SELECT платежи.contr_id, Sum(платежи.summa) AS [Sum-summa]
FROM платежи
GROUP BY платежи.contr_id;
3. И наконец итоговый запрос который объединяет все запросы и таблицы организации, приложения и контракты.
SELECT организации.Nazv, контракты.contr_id, Сумма_АК.[Sum-summa], Сумма_ПЛ.[Sum-summa]
FROM организации INNER JOIN ((контракты LEFT JOIN Сумма_АК ON контракты.contr_id=Сумма_АК.contr_id) LEFT JOIN Сумма_ПЛ ON контракты.contr_id=Сумма_ПЛ.contr_id) ON организации.contrag_id=контракты.contrag_id;
Надеюсь ты знаешь,что такое LEFT JOIN.
Если его не использовать, то контракты по которым не было платежей или ак_платежей, игнорируются.


 
fd979 ©   (2007-02-15 10:16) [22]

Пошли на мыло


 
Клара   (2007-02-15 10:50) [23]


> fd979

И куда сбросить?


 
fd979 ©   (2007-02-15 11:52) [24]

Если нажать на буковку рядом с моим ником, откроется мой профайл.
Там записан мой ящик


 
Andrey-406   (2007-02-15 13:26) [25]

Клара, и мне сбрось пожалуйста, я так и не понял,как использовать в запросе результаты других запросов
andrey-406@yandex.ru


 
Клара   (2007-02-15 16:09) [26]


> Andrey-406

очень мало времени.
Что значит запрос - это та же таблица, вот и подключай его как таблицу.
Советую сделать это в accessе. Нужно бежать, а завтра скину тебе подобную конструкцию.



Страницы: 1 вся ветка

Текущий архив: 2007.03.04;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.046 c
15-1170938697
allucard
2007-02-08 15:44
2007.03.04
Win2000 и подключения(удалённая модератором трабла).


2-1171303026
amphest_coder
2007-02-12 20:57
2007.03.04
Полный выход из углубления через Inherited


15-1171213081
RASkov
2007-02-11 19:58
2007.03.04
Принтеры


15-1171027273
CCili
2007-02-09 16:21
2007.03.04
Оформления продукции? Посоветуйте контору.


4-1161170550
Alex_06
2006-10-18 15:22
2007.03.04
Получение иконки из exe-файла