Форум: "Базы";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.04 c