Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
2-1172731272
roman_ln
2007-03-01 09:41
2007.03.25
Защита программ и данных с использованием электронных ключей.


1-1170495138
Medved_
2007-02-03 12:32
2007.03.25
StringGrid


15-1172172456
Cyrax
2007-02-22 22:27
2007.03.25
Дружественные методы и классы в C#


1-1170401505
KOSS
2007-02-02 10:31
2007.03.25
Autorun


15-1172947756
Cyrax
2007-03-03 21:49
2007.03.25
Процесс подготовки цифровой версии печатной продукции





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский