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

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

Помогите составить SQL [D3, IB6.x]


Stupid ©   (2004-08-31 16:19:00) 

Есть такой запрос :


AM.TmQuery.SelectSQL.Add('SELECT Id_Pr, CP_Num, Pr_PNum, Pr_Nos, Pr_Stund, Pr_MStund, Pr_PNDat, Pr_NDarb,');
AM.TmQuery.SelectSQL.Add('Pr_Cena, Pr_FCena, Pr_TCena, Pr_MCena, Pr_PCena, Pr_PVCena, Pr_CCena,');
AM.TmQuery.SelectSQL.Add('Sum(TS_St), Sum(TS_St*TS_Koef)');
AM.TmQuery.SelectSQL.Add('FROM Projekt, Sub_Kon, Time_Sh');
AM.TmQuery.SelectSQL.Add('WHERE Projekt.Id_Pr = Sub_Kon.Id_Pr and');
AM.TmQuery.SelectSQL.Add('Sub_Kon.Id_SKon = Time_Sh.Id_SKon and');
AM.TmQuery.SelectSQL.Add('GROUP By Id_Pr, CP_Num, Pr_PNum, Pr_Nos, Pr_Stund, Pr_MStund, Pr_Cena, Pr_FCena, Pr_TCena, Pr_MCena, Pr_PCena, Pr_PVCena, Pr_CCena, Pr_PVN, Pr_PNDat, Pr_NDarb');
AM.TmQuery.SelectSQL.Add('ORDER By CP_Num, Id_Pr');


но понадобилось выбирать и те записи, для которых нет ничего в таблице Time_SH.
Как это правильно сделать?


Val   (2004-08-31 18:53:00) [1]

>[8] guest_Dmitry   (31.08.04 18:22)
не путайте человека


guest_Dmitry   (2004-08-31 18:22:00) [2]

select p.id_pr, p.pr_num, s.id_skon, s.skon_num, s.id_pr,
 (select sum(t.ts_st) from time_sh t where t.id_skon =
   s.id_skon)
from project p, sub_kon s
 where p.id = s.id_skon and <.....>
group by p.id_pr, p.pr_num, s.id_skon, s.skon_num, s.id_pr

если верно понял структуру твоих таблиц, то так


Stupid   (2004-08-31 18:09:00) [3]

Есть таблицы
Projekt (Id_Pr, Pr_Num, ...)
под ней
Sub_Kon (Id_SKon, SKon_Num, Id_Pr, ...)
под ней
Time_SH (Id_TS, TS_ST, Id_SKon, ...)

Требуется выбрать все записи из Proekt, для которых есть записи в Sub_Kon, и для каждого Sub_Kon собрать сумму часов SUM(TS_ST) из Time_SH, если есть, если нет - 0;


stud   (2004-08-31 17:54:00) [4]


> AM.TmQuery.SelectSQL.Add('Sub_Kon.Id_SKon = Time_Sh.Id_SKon
> and');

lef outer join time_sh on (sub_kon.id=time_sh.id_skon)


guest_Dmitry   (2004-08-31 17:53:00) [5]

приведи структуры и связи таблиц Projekt, Sub_Kon, Time_Sh
и что тебе в резутьтате получить нужно.


Stupid   (2004-08-31 17:41:00) [6]

попробовал такое, но это вешалка на 20 минут

SELECT Id_Pr, CP_Num, Pr_PNum, Pr_Nos, Pr_Stund, Pr_MStund, Pr_PNDat, Pr_NDarb,
Pr_Cena, Pr_FCena, Pr_TCena, Pr_MCena, Pr_PCena, Pr_PVCena, Pr_CCena, Pr_PVN,
Sum(TS_St), Sum(TS_St*TS_Koef)
FROM Projekt, Sub_Kon, Time_Sh
WHERE Projekt.Id_Pr = Sub_Kon.Id_Pr and
Sub_Kon.Id_SKon = Time_Sh.Id_SKon and
Time_Sh.Ts_Dat >= '01.08.2004' and
Time_Sh.Ts_Dat <= '31.08.2004' and
Sub_Kon.SKon_Mont = 0 and
(Projekt.Pr_NDarb is Null or
Projekt.Pr_NDarb > '31.08.2004') and
(Projekt.Pr_PNDat is Null or
Projekt.Pr_PNDat > '31.08.2004') and
Time_Sh.Ts_Koef > 0
GROUP By Id_Pr, CP_Num, Pr_PNum, Pr_Nos, Pr_Stund, Pr_MStund, Pr_Cena, Pr_FCena, Pr_TCena, Pr_MCena, Pr_PCena, Pr_PVCena, Pr_CCena, Pr_PVN, Pr_PNDat, Pr_NDarb

UNION

SELECT Id_Pr, CP_Num, Pr_PNum, Pr_Nos, Pr_Stund, Pr_MStund, Pr_PNDat, Pr_NDarb,
Pr_Cena, Pr_FCena, Pr_TCena, Pr_MCena, Pr_PCena, Pr_PVCena, Pr_CCena, Pr_PVN,
Cast(0 As Double Precision), Cast(0 As Double Precision)
FROM Projekt, Sub_Kon
WHERE Projekt.Id_Pr = Sub_Kon.Id_Pr and
Not Exists (Select Id_SKon From Time_SH Where Time_SH.Id_SKon = Sub_Kon.Id_SKon) and
Time_Sh.Ts_Dat >= '01.08.2004' and
Time_Sh.Ts_Dat <= '31.08.2004' and
Sub_Kon.SKon_Mont = 0 and
(Projekt.Pr_NDarb is Null or
Projekt.Pr_NDarb > '31.08.2004') and
(Projekt.Pr_PNDat is Null or
Projekt.Pr_PNDat > '31.08.2004')


Stupid   (2004-08-31 17:04:00) [7]

Я в запросах не силён, прочитал про дуае join и union, но так и не понял как их применять в моём случае.
подскажите пожалуйста, если не трудно!


guest_Dmitry   (2004-08-31 16:59:00) [8]

использовать оператор exists


Val   (2004-08-31 16:22:00) [9]

использовать внешнее объединение


Наверх

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