![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как построить запрос [D7, dBase, FoxPro]
andrey-406 © (2007-02-14 10:55:00)Есть 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)
Клара (2007-02-15 16:09:00) [1]
> Andrey-406
очень мало времени.
Что значит запрос - это та же таблица, вот и подключай его как таблицу.
Советую сделать это в accessе. Нужно бежать, а завтра скину тебе подобную конструкцию.
Andrey-406 (2007-02-15 13:26:00) [2]Клара, и мне сбрось пожалуйста, я так и не понял,как использовать в запросе результаты других запросов
andrey-406@yandex.ru
fd979 (2007-02-15 11:52:00) [3]Если нажать на буковку рядом с моим ником, откроется мой профайл.
Там записан мой ящик
Клара (2007-02-15 10:50:00) [4]
> fd979
И куда сбросить?
fd979 (2007-02-15 10:16:00) [5]Пошли на мыло
Клара (2007-02-15 09:33:00) [6]
> 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.
Если его не использовать, то контракты по которым не было платежей или ак_платежей, игнорируются.
Andrey-406 (2007-02-14 18:04:00) [7]Я не очень хорошо знаю SQL, а как это можно объединять запросы?
Клара (2007-02-14 15:50:00) [8]
> Andrey-406
Попробуй создать запрос с группировкой для таблицы платежи (суммируй их), а затем на основе этого запроса создай запрос с соединением, т.е. соедини все нужные таблицы.
Andrey-406 (2007-02-14 15:07:00) [9]то есть?
вот запрос:
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)
а как это ее выставить?
fd979 (2007-02-14 14:28:00) [10]выставь базу
Andrey-406 (2007-02-14 13:40:00) [11]Так данные есть,запрос не видит имя таблицы из главного запроса
fd979 (2007-02-14 12:56:00) [12]IIf(expr, truepart, falsepart)
expr - проверяет на истинность или ложность
truepart - выполняется, если True
falsepart - выполняется, если False
Применимо к твоей задаче проверяется есть ли вообще такие данные или нет. Если нет то возвращается 0, если есть тогда сами данные (то есть сумма).
Andrey-406 (2007-02-14 12:51:00) [13]А что делает IIF? Что то я такой функции не встречал...
fd979 (2007-02-14 12:46:00) [14]Что не поддерживается? IIF?
А нет заменителя? Что-нибудь да должно быть
Andrey-406 (2007-02-14 12:23:00) [15]увы, написано, что такое свойство не поддерживается.
ЮЮ (2007-02-14 12:17:00) [16]
> А оно не работает,такое впечатление
Правильное впечатление. Особенно, если это ВDE и LocalSQL. На таком запросе и сервер надолго загрузится :)
SELECT contr_id , SUM(summa) summa FROM pays Group BY contr_id - в Local View, а затем уже связывать с дугими таблицами
fd979 (2007-02-14 12:11:00) [17]а так?
fd979 (2007-02-14 12:11:00) [18]
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
Andrey-406 (2007-02-14 12:00:00) [19]А оно не работает,такое впечатление что в подзапросе недоступно значение org.contr_id,в результате получаются пустые значения,а вот если подставить число например 1 ,то суммы считаются
fd979 (2007-02-14 11:50:00) [20]
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
Может так? Проверь наверно есть какая-то ошибка у меня. Но в общем и целом работать должно... А может и нет