Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

Проблема с запросом...(LEFT JOIN)   Найти похожие ветки 

 
SergP ©   (2004-07-29 15:52) [0]

БД FOXPRO

Запросы:

select p,sum(plm) as plm,sum(mon) as mon
from mytable1
where vb=30
group by p

и

select podat.p, podat.name, a.plm as dplan, a.mon as dfakt
from podat
left join mytable2 a on (podat.p=a.p)

по отдельности работают, однако когда я делаю вложенный запрос:

select podat.p, podat.name, a.plm as dplan, a.mon as dfakt
from podat
left join
(select p,sum(plm) as plm,sum(mon) as mon from mytable1 where vb=30 group by p) a on (podat.p=a.p)

то не хочет работать...

Уже решил попробовать создавать типа временной таблицы:
ADOConnection1.Execute("select p,sum(plm) as plm ,sum(mon) as mon from mytable1 where vb=30 group by p into table mytable2");

чтобы потом использовать ее в основном запросе, но эта таблица почему-то не создается...
Что делать?
Желательно если можно помогите с вложенный запросом,
а если нельзя то как сделать с помощью создания промежуточной таблицы?


 
Johnmen ©   (2004-07-29 16:02) [1]

М.б. тебе надо просто
select T1.p, T1.name, sum(T2.plm) as dplan, sum(T2.mon) as dfakt
from podat T1
left join mytable1 T2 on (T1.p=T2.p)
where T2.vb=30
group by T1.p, T1.name


 
SergP ©   (2004-07-29 16:12) [2]


> Johnmen ©   (29.07.04 16:02) [1]


Дело в том что это  запрос я упростил... На самом деле у меня там 2 левых джоина. Вобщем вот такой у меня запрос на самом деле(правда не рабочий):

fplan, ffakt:string; // там имена полей хранятся...
...

   zsql:="select podat.p, podat.name, nvl(a."+fplan+",0)+nvl(b."+fplan+",0) as zplan,nvl(a."+ffakt+",0)+nvl(b."+ffakt+",0) as zfakt, a."+fplan+" as dplan, a."+ffakt+" as dfakt, b."+fplan+" as mplan, b."+ffakt+" as mfakt "
  +"from podat "
  +"left join (select p,sum("+fplan+") as "+fplan+",sum("+ffakt+") as "+ffakt+" from "+base+" where vb=30 group by p) a on (podat.p=a.p) "
  +"left join (select p,sum("+fplan+") as "+fplan+",sum("+ffakt+") as "+ffakt+" from "+base+" where vb=50 group by p) b on (podat.p=b.p) "
  +"order by podat.ord";

Вашим способом тоже ранее пробовал делать, но суммы неправильно считаются.(наверное из-за того что 2 джоина)


 
SergP ©   (2004-07-29 16:13) [3]


> Johnmen ©   (29.07.04 16:02) [1]


Дело в том что это  запрос я упростил... На самом деле у меня там 2 левых джоина. Вобщем вот такой у меня запрос на самом деле(правда не рабочий):

fplan, ffakt:string; // там имена полей хранятся...
base:string; // там имя таблицы
...

   zsql:="select podat.p, podat.name, nvl(a."+fplan+",0)+nvl(b."+fplan+",0) as zplan,nvl(a."+ffakt+",0)+nvl(b."+ffakt+",0) as zfakt, a."+fplan+" as dplan, a."+ffakt+" as dfakt, b."+fplan+" as mplan, b."+ffakt+" as mfakt "
  +"from podat "
  +"left join (select p,sum("+fplan+") as "+fplan+",sum("+ffakt+") as "+ffakt+" from "+base+" where vb=30 group by p) a on (podat.p=a.p) "
  +"left join (select p,sum("+fplan+") as "+fplan+",sum("+ffakt+") as "+ffakt+" from "+base+" where vb=50 group by p) b on (podat.p=b.p) "
  +"order by podat.ord";

Вашим способом тоже ранее пробовал делать, но суммы неправильно считаются.(наверное из-за того что 2 джоина)


 
SergP ©   (2004-07-29 16:21) [4]

т.е. суммы не правильно считались если я делал групировку в основном запросе. Если не делать групировку то видно даже почему они неправильно считались: если для одной записи в podat.dbf выбирались по 3 записи из каждого джоина, тов результате я получал 9 записей... и поэтому при групировке суммы утраивались...

поэтому я решил сделать делать вложенные запросы и групировать в них... Но почему-то такие запросы где используется левый джоин не из таблицы, а из вложенного запроса select вообще не работают. Получаю сообщение об ошибке в запросе..


 
stud   (2004-07-29 16:32) [5]

так может использовать внешнее обединение? только определиться с ведущей таблицей


 
Johnmen ©   (2004-07-29 16:51) [6]

>SergP ©   (29.07.04 16:13) [3]

Это понятно, что будет неверно считаться. Даже если внутреннее соединение.
Потому, что это фактически попытка посчитать в одном запросе "несовместимые" сущности, сделать типа кросс-таблицы...
Простейший выход - несколько запросов.


 
SergP ©   (2004-07-29 17:26) [7]


> Johnmen ©   (29.07.04 16:51) [6]


Как сделать несколько запросов? Т.е. где должен быть промежуточный результат? Пробовал так как я описал в сабжевом посте (вариант с несколькими запросами), но почему-то промежуточная таблица не формируется. И при выполнении последнего запроса выскакивает ошибка что нет файла (таблицы), который по идее должен был сформироваться предыдущим запросом, который я пробовал делать ADOConnection1.Execute


 
Johnmen ©   (2004-07-29 17:31) [8]

Не надо промежуточных.
Просто выполни ряд запросов, в каждом из которых не более одного соединения.
Если их результаты надо собрать в один НД, попробуй UNION.



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
1-1091712985
mouse_web
2004-08-05 17:36
2004.08.22
поле EDIT


1-1092137500
Fynjy
2004-08-10 15:31
2004.08.22
Моргает Image


1-1091796216
Blick
2004-08-06 16:43
2004.08.22
Работа с файлами


1-1091623736
П7
2004-08-04 16:48
2004.08.22
Как заставить приложение читать себя как обычный файл?


14-1091366437
Dima
2004-08-01 17:20
2004.08.22
Впрос по железу