![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите составить 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]использовать внешнее объединение