Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL Запрос [D7, Access]


Kley ©   (2007-01-02 18:48:00) 

Здравствуйте подскажите плиз
есть  три таблицы (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 записей хотя в БД гораздо больше
как лучше сделать?


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

>Виталий Панасенко ©   (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
Так тоже отработало нормально
Спасибо Виталий
Спасибо всем


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

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


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

А так?
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


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

проблема так решилась:
Знаешь, я бы сделал так. Завел бы прямо в 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 09:34:00) [5]

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


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

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


Johnmen   (2007-01-03 22:48:00) [7]


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


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


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

[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 20:25:00) [9]

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


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

А так ?
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');


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

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;
ошибка не поддерживается выражение объединения


Desdechado   (2007-01-02 20:30:00) [12]

select + F1


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

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


Desdechado   (2007-01-02 19:17:00) [14]

LEFT OUTER JOIN


Наверх

Титульная страница Поиск, карта сайта Написать письмо