Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

Проблема с запросом...(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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.033 c
1-1091627606
stelius
2004-08-04 17:53
2004.08.22
По поводу ShowModal


14-1091360777
Antonmm
2004-08-01 15:46
2004.08.22
Создание exe


3-1091433008
Last
2004-08-02 11:50
2004.08.22
Проверка вводимого значения в DBGrid


14-1091694244
Goorus
2004-08-05 12:24
2004.08.22
А с вами такое бывает?


1-1091810693
Lamak
2004-08-06 20:44
2004.08.22
Про RichEdit





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский