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

Вниз

SQL Запрос   Найти похожие ветки 

 
Kley   (2007-01-02 18:48) [0]

Здравствуйте подскажите плиз
есть  три таблицы (prihod,dolg,kassa)связанных с четвертой таблицей
-справочником (clients) через DBLookupCombobox   (clients.number=prihod.potreb, clients.number=dolg.potreb,clients.number=kassa.potreb)
нужно получить из таблицы (clients) наименование (clients.name) из остальных таблиц суммы (Prihod.s1,dolg.s1,kassa.summa)
делаю так:
datamodule1.RashKAQuery.Close;
datamodule1.RashKAQuery.SQL.Clear;
datamodule1.RashKAQuery.SQL.Add("Select distinct c.number,c.name, sum (p.s1),sum (d.S1),sum(k.summa) from Clients c,dolg d ,prihod p,kassa k
where c.number=p.potreb and c.number=d.potreb and c.number=k.potreb and d.actionx=1 and p.actionx=1 and k.actionx=1 group by c.number,c.name");
datamodule1.RashKAQuery.Open;
actionx=1-приход склада
выходит 6 записей хотя в БД гораздо больше
как лучше сделать?


 
Desdechado ©   (2007-01-02 19:17) [1]

LEFT OUTER JOIN


 
Kley   (2007-01-02 20:07) [2]

а пример можно плиз


 
Desdechado ©   (2007-01-02 20:30) [3]

select + F1


 
Kley   (2007-01-02 20:58) [4]

atamodule1.RashKAQuery.Close;
datamodule1.RashKAQuery.SQL.Clear;
datamodule1.RashKAQuery.SQL.Add("Select distinct c.number,c.name, sum (p.s1),sum(d.s1) from Clients c LEFT OUTER JOIN  prihod p on c.number=p.potreb, Clients c LEFT OUTER JOIN dolg d ON c.number=d.potreb
where p.actionx=1 and d.actionx=1  group by c.number,c.name");
datamodule1.RashKAQuery.Open;
ошибка не поддерживается выражение объединения


 
Виталий Панасенко ©   (2007-01-03 20:16) [5]

А так ?
datamodule1.RashKAQuery.SQL.Add("Select distinct c.number,c.name, sum (p.s1),sum(d.s1) from Clients c LEFT OUTER JOIN  prihod p on c.number=p.potreb LEFT OUTER JOIN dolg d ON c.number=d.potreb
where p.actionx=1 and d.actionx=1  group by c.number,c.name");


 
Johnmen ©   (2007-01-03 20:25) [6]

Виталий, зачем повторять этот бред с дистинктом и группировкой? Товарищ, понятное дело, SQL не знает. Но ты то знаешь, наверное...
И ещё. Надо учесть, что даже корректно написанный запрос с агрегаными ф-ми типа SUM не даст верных значений при таком соединении более 2-ух таблиц.


 
Kley   (2007-01-03 22:07) [7]

[6] Виталий, зачем повторять этот бред с дистинктом и группировкой? Товарищ, понятное дело, SQL не знает. Но ты то знаешь, наверное...
И ещё. Надо учесть, что даже корректно написанный запрос с агрегаными ф-ми типа SUM не даст верных значений при таком соединении более 2-ух таблиц.

Ну подскажи что нибудь дельное
понятно что Group by и без Distinct исключает дублирование но дело то не в этом.

[5]
Вот так вроде бы пошло но результат не устраивает суммы какието не те datamodule1.RashKAQuery.SQL.Add("Select  c.number,c.name, sum (p.s1),sum(d.s1) from (Clients c LEFT OUTER JOIN  prihod p on c.number=p.potreb)
LEFT OUTER JOIN dolg d ON c.number=d.potreb
where p.actionx=1 and d.actionx=1")


 
Johnmen ©   (2007-01-03 22:48) [8]


> Вот так вроде бы пошло но результат не устраивает суммы
> какието не те


[6] последнее предложение.


 
Kley   (2007-01-04 09:17) [9]

>И ещё. Надо учесть, что даже корректно написанный запрос с агрегаными >ф-ми типа SUM не даст верных значений при таком соединении более 2-ух >таблиц.
Johnmen Ты прав с 2 таблицами все нормально получается а как тогда 3 прикрутить?


 
ЮЮ ©   (2007-01-04 09:34) [10]

Соединять не таблицы, а уже "проагрегированные" подзапросы


 
Kley   (2007-01-04 11:51) [11]

проблема так решилась:
Знаешь, я бы сделал так. Завел бы прямо в Access 3 вспомогательных запроса следующего вида

qdolg: SELECT potreb, Sum(s1) AS SumOfDolg FROM dolg WHERE (actionx=1) GROUP BY potreb

qkassa: SELECT potreb, Sum(summa) AS SumOfKassa FROM kassa WHERE (actionx=1) GROUP BY potreb

qprihod: SELECT potreb, Sum(s1) AS SumOfPrihod FROM prihod WHERE (actionx=1) GROUP BY potreb

А после этого результрующий запрос выглядел бы следующим образом:
SELECT c.number, c.Name, d.SumOfDolg, k.SumOfKassa, p.SumOfPrihod
FROM ((clients AS c LEFT JOIN qdolg AS d ON c.number = d.potreb)
LEFT JOIN qkassa AS k ON c.number = k.potreb)
LEFT JOIN qprihod AS p ON c.number = p.potreb

Или, если хочется, чтобы не было пустых полей, то что-то вроде:
SELECT c.number, c.Name, nz(d.SumOfDolg,0), nz(k.SumOfKassa,0), nz(p.SumOfPrihod,0)
FROM ((clients AS c LEFT JOIN qdolg AS d ON c.number = d.potreb)
LEFT JOIN qkassa AS k ON c.number = k.potreb)
LEFT JOIN qprihod AS p ON c.number = p.potreb

Надеюсь, функция NZ в Access 2003 сохранилась.

P.S. Если работать непосредственно в Access, то все работает как надо. Будт ли работать через ADO, не знаю. Проверить не на чем.

Аналог вспомогательных запросов в других СУБД -- это либо временные таблицы, либо VIEW.
 Geo


 
Виталий Панасенко ©   (2007-01-04 11:54) [12]

А так?
select c.number, c.name, (select sum(p.s1) from prihod p where p.potreb=c.number) as sum1, (select sum(d.s1) from dolg d where d.potreb=c.number) as sum2 from clients c


 
sniknik ©   (2007-01-04 12:13) [13]

> Надеюсь, функция NZ в Access 2003 сохранилась.
в access сохранилась, а вот в jet ее изначально не было (это функция самой программы access).


 
Kley   (2007-01-04 13:51) [14]

>Виталий Панасенко ©   (04.01.07 11:54) [12]
>А так?
>select c.number, c.name, (select sum(p.s1) from prihod p where >p.potreb=c.number) as sum1, (select sum(d.s1) from dolg d where >d.potreb=c.number) as sum2 from clients c
Так тоже отработало нормально
Спасибо Виталий
Спасибо всем



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

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

Наверх




Память: 0.5 MB
Время: 0.031 c
2-1172841092
VadimK
2007-03-02 16:11
2007.03.25
Не пойму почему не освобождается память


2-1173021118
Tru
2007-03-04 18:11
2007.03.25
Enabled


1-1170404286
Error404
2007-02-02 11:18
2007.03.25
Проверить заполнение компонентов


3-1167288128
inlimbo
2006-12-28 09:42
2007.03.25
Недост. сведения о ключ. поле. Обновление одного поля не удается


1-1170346289
DelphiLexx
2007-02-01 19:11
2007.03.25
Заставить сработать DataSet.OnCalcFields для всех записей