![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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