Текущий архив: 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.045 c