Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / немогу построить простой запрос / 6 сообщений из 6, страница 1 из 1
24.07.2008, 12:03
    #35449114
zloyGamer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
немогу построить простой запрос
вообщем нужно выбрать одну фамилию и суммы связанные с этой фамилией из 2х других таблиц
следующий запрос перебирает все комбинации записей из tbZarpl и tbPay с одинаковыми idfio:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT   f.idfio,  f.fio,  SUM(z.zarpl),  SUM(p.pay)
FROM 
  tbFio f LEFT JOIN tbZarpl z ON z.idfio=f.idfio
          LEFT JOIN tbPay p ON p.idfio=f.idfio
WHERE f.idFio= 1 
GROUP BY   f.fio,f.idfio
;
мне не нужны суммы этих комбинаций, мне нужны просто суммы полей
как еслибы я делал:
Код: plaintext
1.
2.
3.
4.
SELECT   f.idfio,  f.fio,  SUM(z.zarpl)
FROM 
  tbFio f LEFT JOIN tbZarpl z ON z.idfio=f.idfio
WHERE f.idFio= 1 
GROUP BY   f.idfio,f.fio
и
Код: plaintext
1.
2.
3.
4.
SELECT   f.idfio,  f.fio,  SUM(p.pay)
FROM 
  tbFio f LEFT JOIN tbPay p ON p.idfio=f.idfio
WHERE f.idFio= 1 
GROUP BY   f.idfio,f.fio

подскажите пожалуста, чет совсем не дружу с SQL'ем (
...
Рейтинг: 0 / 0
24.07.2008, 12:37
    #35449239
немогу построить простой запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT  f.idfio  ;
           ,f.fio    ;
           ,(select SUM(z.zarpl) from tbZarpl z where z.idfio=f.idfio) ;
           ,(select SUM(p.pay) from tbPay p where p.idfio=f.idfio) ;
FROM tbFio f  ;
WHERE f.idFio= 1 
...
Рейтинг: 0 / 0
24.07.2008, 14:18
    #35449587
zloyGamer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
немогу построить простой запрос
спасибо тебе заяц, но я думаю с под запросами я бы и сам решил эту задачу,
тут проблема в том что я непонимаю как тут обойтись одним запросом, возможно что то не так с группировками?
...
Рейтинг: 0 / 0
24.07.2008, 16:33
    #35450051
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
немогу построить простой запрос
Ты вообще-то представляешь как работает объединение по JOIN?

В качестве модели можно представить себе такую схему:

1. Берется первая запись из первой таблицы
2. Берется первая запись удовлетворяющая условию объединения из второй таблицы по значению текущей записи первой таблицы
3. Берется первая запись удовлетворяющая условию объединениа из третьей таблицы по значению текущих записей первой и второй таблиц (сопоставлена с первой записью из второй таблицы)
4. Берется вторая запись удовлетворяющая условию объединения из третьей таблицы по значению текущих записей первой и второй таблиц (также сопоставлена с первой записью из второй таблицы)
5...

Когда закончились записи удовлетворяющие условию объединения в третьей таблице по текущем записям первой и второй таблицы берем вторую запись из второй таблицы и повторяем цикл

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

Предположим, в таблице tbZarpl есть 2 записи с кодом idfio = 1, а в таблице tbPay есть 3 записи с кодом idfio = 1.

В результате, для idfio = 1 получим 2*3 = 6 записей в результирующей выборке. Потом выполняется суммирование по этим 6 записям.

Другими словами, каждую запись из таблицы tbZarpl ты используешь столько раз, сколько записей с тем же значением idfio есть в таблице tbPay и наоборот.

LEFT JOIN, в данном случае, мало что изменит. Оно определяет поведение только в том случае, когда для указанного значения idfio нет записей в таблицах tbZarpl или tbPay.

Поэтому, без подзапросов данная задача не решается.
...
Рейтинг: 0 / 0
24.07.2008, 16:44
    #35450091
немогу построить простой запрос
вот еще вариант, если уж так хочется приджоинить
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
local lnId
lnId =  1 
SELECT  f.idfio,  f.fio,  z.zarpl, p.pay ;
FROM tbFio f ;
     left JOIN (select SUM(zarpl) as zarpl from tbZarpl where idfio=lnId) z ON .t. ;
     left JOIN (select SUM(pay)   as pay   from tbPay  where idfio=lnId) p ON .t. ;
 WHERE f.idFio=lnId
...
Рейтинг: 0 / 0
28.07.2008, 17:15
    #35456099
beginner__fox
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
немогу построить простой запрос
zloyGamerвообщем нужно выбрать одну фамилию и суммы связанные с этой фамилией из 2х других таблиц
следующий запрос перебирает все комбинации записей из tbZarpl и tbPay с одинаковыми idfio:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT   f.idfio,  f.fio,  SUM(z.zarpl),  SUM(p.pay)
FROM 
  tbFio f LEFT JOIN tbZarpl z ON z.idfio=f.idfio
          LEFT JOIN tbPay p ON p.idfio=f.idfio
WHERE f.idFio= 1 
GROUP BY   f.fio,f.idfio
;


А результата запроса привести можете?
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / немогу построить простой запрос / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]