Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как построить запрос [D7, dBase, FoxPro]


Страницы:   1 2

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


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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо