powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Дублирование данных в запросе
44 сообщений из 44, показаны все 2 страниц
Дублирование данных в запросе
    #32332025
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
SELECT sum(cash.эквивалент1) as a
FROM Calc LEFT JOIN Cash ON Calc.[Реф №] = Cash.[Реф №]
WHERE (((Calc.Статус)= "Получено" ) AND ((Cash.[Реф №])='12=145'));

Результат этого запроса в два раза больше, чем есть на самом деле.

Проверял, что там происходит так:
Код: plaintext
1.
2.
SELECT cash.* as a
FROM Calc LEFT JOIN Cash ON Calc.[Реф №] = Cash.[Реф №]
WHERE (((Calc.Статус)= "Получено" ) AND ((Cash.[Реф №])='12=145'));

Количество возвращенных строк = кол-во нужных строк в таблице cash *
кол-во нужных строк в таблице calc
почему так происходит?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332031
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT cash.* as a - это опечатка :)
следует читать как SELECT cash.*
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332123
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
автор писал:Проверял, что там происходит так:
Там - это где?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332128
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверял, что происходит в запросе.
Первый вариант возвращал одно только число - вот я и посмотрел, что "там" со строками происходит
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332132
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Даны два запроса. Первый неправильный, а второй "там". Каким образом второй получен из первого? И откуда известно, что второй правильный?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332138
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Саныч,первый запрос с Sum, второй почти такой же ,но без суммирования,возвращающий все записи.Умение внятно формулировать свои мысли не относится к главным достоинствам VsevolodV (впрочем как и к моим),
но в данном случае все понятно.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332139
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким образом второй получен из первого?
SELECT cash.*
вместо
SELECT sum(cash.эквивалент1) as a

И откуда известно, что второй правильный?
Просто я посмотрел, что происходит со строками при таком джойне и условии where.
Он неправильный - в нем ровно в два раза больше строк, чем должно быть,т.е.
Код: plaintext
1.
2.
3.
4.
ID_OPER     Приход
    1            23 
    2            45 
    1            23 
    2            45 

ID_OPER - порядковый номер операции
Если в таблицу Calc добавить еще одну строку, удовлетворяющую условию, то запрос даст нам в три раза больше строк, т.е. будет
Код: plaintext
1.
2.
3.
4.
5.
6.
ID_OPER     Приход
    1            23 
    2            45 
    1            23 
    2            45 
    1            23 
    2            45 
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332142
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 VsevolodV
Скорее всего у тебя в какой то из таблиц есть дубликаты, или джойнишь неправильно
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332144
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ID_OPER - ключевое поле
Пробовал INNER JOIN, LEFT JOIN и RIGHT JOIN - результат не изменялся
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332149
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и где в твоих запросах используется ID_OPER ?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332151
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так его вроде и не нужно использовать - таблицы связываются по полю [Реф №]
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332154
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Провел эксперимент:
Новый МДБ. Создал в нем две таблици Calc и Cash:
Calc:
Код: plaintext
1.
2.
3.
 Реф №   Статус
 12 = 145   Получено
 12 = 145   Получено
 12 = 145   Получено


Cash:
Код: plaintext
1.
2.
 Реф №   Приход
 12 = 145        15 
 12 = 145        5 


Запрос:
Код: plaintext
1.
2.
SELECT cash.*
FROM Calc LEFT JOIN Cash ON Calc.[Реф №] = Cash.[Реф №]
WHERE (((Calc.Статус)= "Получено" ) AND ((Cash.[Реф №])='12=145'));


Результат запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
 Реф №   Приход
 12 = 145        15 
 12 = 145        15 
 12 = 145        15 
 12 = 145        5 
 12 = 145        5 
 12 = 145        5 
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332161
(c)VIG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vsevolod,читай мой пост от 14:49
У тебя 3 строкам из Calc соответствуют 2 строки из Cash.В результате соединения ты получишь (и получаешь) 6 строк результирующего набора.
И объясни мне, зачем хранить в таблицах дубликаты?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332415
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что значит дубликат?
Если имеется ввиду, что одна запись записана два раза, то такого нет.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332434
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите разобраться. По-моему, сам запрос "в корне" составлен неправильно.
Нужно вот что: Если в строках с определенным [Реф №] таблицы Calc есть хотя бы одна строка, в которой статус = "Получено", то по этому [Реф №] нужно посчитать sum(cash.эквивалент1) из таблицы Cash соответственно.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332437
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так по-моему будет правильнее:
Код: plaintext
1.
2.
SELECT Nz(sum(Cash.Эквивалент1), 0 )
FROM cash
WHERE Cash.[Реф №]  in  (select [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]='12=145');

Но тут проблема в том, что почему то этот запрос выполняется втечение 30 секунд.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32332443
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так работает быстро:
Код: plaintext
1.
2.
SELECT Nz(sum(Cash.Эквивалент1), 0 )
FROM cash
WHERE Cash.[Реф №]  = (select TOP  1  [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]='12=145');

Но если этот запрос вставить в основной запрос, то работа очень сильно замедляется:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    Str1 =  "SELECT t.[Реф №], t.Наименование, t.Потребитель, t.Эквивалент AS Стоимость, t.Количество, "  _
        &  "(SELECT Nz(sum(calc.Эквивалент2),0 ) from calc Where calc.[реф №] = t.[реф №]) AS Себестоимость, " _
        &  "(SELECT Nz(sum(cash.Эквивалент1),0 ) from cash Where cash.[реф №] = t.[реф №]) AS Приход_к, " _
        &  "(SELECT Nz(sum(bank.Эквивалент1),0 ) from bank Where bank.[реф №] = t.[реф №]) AS Приход_б, " _
        &  "(SELECT Nz(sum(cash.Эквивалент2),0 ) from cash Where cash.[реф №] = t.[реф №]) AS Расход_к, " _
        &  "(SELECT Nz(sum(bank.Эквивалент2),0 ) from bank Where bank.[реф №] = t.[реф №]) AS Расход_б, " _
        &  "(SELECT Nz(Sum(Cash.Эквивалент1),0 ) from cash Where cash.[Реф №] = (SELECT TOP  1  [реф №] from calc " _
        &  "Where Calc.Статус='получено' AND Calc.[Реф №]= t.[реф №])) AS Получено_пост, "  _
        &  "CDbl(Приход_к) + CDbl(Приход_б) as Опл_зак, "  _
        &  "CDbl(Расход_к) + CDbl(Расход_б) as Опл_фирм, "  _
        &  "CDbl(Стоимость) - CDbl(Себестоимость) as Доход "  _
        &  "FROM Orders AS t " 

Что тут можно предпринять?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333224
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В зависимости от условия WHERE запрос может выполняться 5 минут и более :(
Должны же быть какие-нибудь пути оптимизации.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333257
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге я прихожу к выводу, что и этот запрос не работает :(
Допустим в таком варианте поле "Получено_пост" всегда равняется 0
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT t.[Реф №], t.Наименование, t.Потребитель, t.Эквивалент AS Стоимость, t.Количество, 
       (SELECT Nz(sum(calc.Эквивалент2), 0 ) from calc Where calc.[реф №] = t.[реф №]) AS Себестоимость, 
       (SELECT Nz(sum(cash.Эквивалент1), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Приход_к, 
       (SELECT Nz(sum(bank.Эквивалент1), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Приход_б, 
       (SELECT Nz(sum(cash.Эквивалент2), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Расход_к, 
       (SELECT Nz(sum(bank.Эквивалент2), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Расход_б, 
       (SELECT Nz(Sum(Cash.Эквивалент1), 0 ) from cash Where cash.[Реф №] = (SELECT TOP  1  [реф №] from calc 
       Where Calc.Статус='получено' AND Calc.[Реф №]= t.[реф №])) AS Получено_пост, 
       CDbl(Приход_к) + CDbl(Приход_б) as Опл_зак, 
       CDbl(Расход_к) + CDbl(Расход_б) as Опл_фирм, 
       CDbl(Стоимость) - CDbl(Себестоимость) as Доход 
       FROM Orders AS t 
where t.[дата начала]  between # 14 / 09 / 2003 # and # 20 / 09 / 2003 #

Я уже вообще ничего не понимаю :( Почему не работает??? Что делать???
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333264
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
автор писал:between #14/09/2003# and #20/09/2003#
В селектах даты пишутся по MMDDYYYY! Этому посвящена половина форума.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333277
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой! Забыл :)
Но это не влияет на расчет вышеуказанного поля.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333321
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
SELECT sum(Nz(Cash.Эквивалент1, 0 ))
FROM cash
WHERE Cash.[Реф №]  = 
(select distinct [реф №] from calc 
where Calc.Статус='получено' 
AND Calc.[Реф №]='12=145');
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333346
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT t.[Реф №], t.Наименование, t.Потребитель, t.Эквивалент AS Стоимость, t.Количество, 
       (SELECT Nz(sum(calc.Эквивалент2), 0 ) from calc Where calc.[реф №] = t.[реф №]) AS Себестоимость, 
       (SELECT Nz(sum(cash.Эквивалент1), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Приход_к, 
       (SELECT Nz(sum(bank.Эквивалент1), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Приход_б, 
       (SELECT Nz(sum(cash.Эквивалент2), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Расход_к, 
       (SELECT Nz(sum(bank.Эквивалент2), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Расход_б, 
       (SELECT sum(Nz(Cash.Эквивалент1, 0 )) FROM cash WHERE Cash.[Реф №]  =
(select distinct [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]='12=145')) AS Получено_пост, 
       CDbl(Приход_к) + CDbl(Приход_б) as Опл_зак, 
       CDbl(Расход_к) + CDbl(Расход_б) as Опл_фирм, 
       CDbl(Стоимость) - CDbl(Себестоимость) as Доход 
       FROM Orders AS t 
where t.[дата начала]  between # 02 / 04 / 2002 # and # 09 / 09 / 2004 #

Работает быстро, но поле Получено_пост = NULL
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333349
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предыдущего поста НЕ БЫЛО :)
Я забыл t.[реф №].
---
работает долго! ОЧЕНЬ ДОЛГО
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333373
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А пробовал IIF вместо NZ. Функции в запросах - штука о-о-оч-ч-ч-чень тормозная.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333376
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пробовал. А надо ли? Вот такая строка сама по себе отрабатывается моментально:
Код: plaintext
1.
2.
SELECT sum(Nz(Cash.Эквивалент1, 0 )) 
FROM cash 
WHERE Cash.[Реф №]  = (select distinct [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]='12=145')
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333383
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А весь запрос без этой строки?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333387
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без нее работает быстро!
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333400
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WHERE Cash.[Реф №] = (select distinct [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]= t.[Реф №])?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333404
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333420
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sum(Nz(Cash.Эквивалент1,0))
FROM cash, Calc
WHERE (Calc.[Реф №] = t.[Реф №] AND Calc.Статус='получено') AND (Cash.[Реф №] = Calc.[Реф №])

???
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333427
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считает быстро, но вместо 1985,9 в поле число 5957,8.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333442
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут идет такое же дублирование как и то, о котором я говорил вначале топика. Результат превышает реальный ответ ровно в 4 раза
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333445
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее в 3 раза :)
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333462
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторю вопрос для вновь прибывших:
Есть нормально работающий запрос
Код: plaintext
1.
2.
3.
SELECT sum(Nz(Cash.Эквивалент1, 0 )) 
FROM cash 
WHERE Cash.[Реф №]  =
(select distinct [реф №] from calc where Calc.Статус='получено' AND Calc.[Реф №]='12=145')

Но, если этот запрос вставить в другой запрос, то скорость замедляется в ДЕСЯТКИ раз
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT t.[Реф №], t.Наименование, t.Потребитель, t.Эквивалент AS Стоимость, t.Количество, 
(SELECT Nz(sum(calc.Эквивалент2), 0 ) from calc Where calc.[реф №] = t.[реф №]) AS Себестоимость,
(SELECT Nz(sum(cash.Эквивалент1), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Приход_к,
(SELECT Nz(sum(bank.Эквивалент1), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Приход_б,
(SELECT Nz(sum(cash.Эквивалент2), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Расход_к, 
(SELECT Nz(sum(bank.Эквивалент2), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Расход_б,
(SELECT Nz(Sum(Cash.Эквивалент1), 0 ) from cash Where cash.[Реф №] = 
(SELECT TOP  1  [реф №] from calc Where Calc.Статус='получено' AND Calc.[Реф №]= t.[реф №])) AS Получено_пост, 
CDbl(Приход_к)+CDbl(Приход_б) AS Опл_зак, 
CDbl(Расход_к)+CDbl(Расход_б) AS Опл_фирм, 
CDbl([Стоимость])-CDbl(Себестоимость) AS Доход
FROM Orders AS t
WHERE t.[дата начала] Between # 4 / 9 / 2003 # And # 9 / 9 / 2003 #;

Как оптимизировать такой запрос???
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333464
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опечатка во втором запросе: вместо "TOP 1" д.б. distinct
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32333860
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>то скорость замедляется в ДЕСЯТКИ раз

ничего удивительного. Для _каждой_ записи конечного запроса вычисляется по нескольку группировочных запросов.
Если задача сформулирована правильно, то есть например такой способ:
1. предположим, что полное число [реф №] невелико. Тогда вместо вычисления запросов вида {SELECT Nz(sum(calc.Эквивалент2)...} для _каждой_ записи общего запроса надо выполнить некий запрос с ГРУППИРОВКОЙ по [реф №], а уж его цеплять внешним джойном к результирующему запросу. Можно даже складирвать результаты группировки в темповую таблицу.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338590
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  SELECT DISTINCT t.[Реф №], t.Наименование, t.Потребитель, nz(t.Эквивалент, 0 ) AS Стоимость, t.Количество,
        (SELECT Nz(sum(calc.Эквивалент2), 0 ) from calc Where calc.[реф №] = t.[реф №]) AS Себестоимость, 
        (SELECT Nz(sum(cash.Эквивалент1), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Приход_к, 
        (SELECT Nz(sum(bank.Эквивалент1), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Приход_б, 
        (SELECT Nz(sum(cash.Эквивалент2), 0 ) from cash Where cash.[реф №] = t.[реф №]) AS Расход_к, 
        (SELECT Nz(sum(bank.Эквивалент2), 0 ) from bank Where bank.[реф №] = t.[реф №]) AS Расход_б, 
        CDbl(Приход_к) + CDbl(Приход_б) as Опл_зак, 
        CDbl(Расход_к) + CDbl(Расход_б) as Опл_фирм, 
        CDbl(Стоимость) - CDbl(Себестоимость) as Доход_пл, 
        ((CDbl(Приход_к) + CDbl(Приход_б)) - (CDbl(Расход_к) + CDbl(Расход_б))) as Доход_р, 
        (SELECT Nz(sum(Realization.Эквивалент1), 0 ) from Realization Where Realization.[реф №] = t.[реф №]) as Получ_от_пост, 
        (SELECT Nz(sum(Realization.Эквивалент2), 0 ) from Realization Where Realization.[реф №] = t.[реф №]) as Отпущ_кл 
        FROM Orders AS t

Если обрабатывать большое количество записей, то работает очень долго.
Есть ли способы ускорения этого запроса (например, выполнение по частям или что-нибудь еще)?
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338620
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему бы не сделать группировочные запросы для каждой таблицы, по которой надо посчитать сумму? А потом использовать RIGHT JOIN. По крайней мере для таблиц cash и bank окажется по одному запросу вместо двух в приведенном примере.
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338707
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT DISTINCT t.[Реф №], t.Наименование, t.Потребитель, nz(t.Эквивалент, 0 ) AS Стоимость, t.Количество,
Nz(Sum(cash.Эквивалент1), 0 ) AS Приход_к, 
Nz(Sum(cash.Эквивалент2), 0 ) AS Расход_к, 
Nz(Sum(bank.Эквивалент1), 0 ) AS Приход_б, 
Nz(Sum(bank.Эквивалент2), 0 ) AS Расход_б, 
Nz(Sum(calc.Эквивалент2), 0 ) AS Себестоимость, 
Nz(Sum(Realization.Эквивалент1), 0 ) AS Получ_от_пост,
Nz(Sum(Realization.Эквивалент2), 0 ) AS Отпущ_кл, 
CDbl(Приход_к)+CDbl(Приход_б) AS Опл_зак, 
CDbl(Расход_к)+CDbl(Расход_б) AS Опл_фирм, 
CDbl(Стоимость)-CDbl(Себестоимость) AS Доход_пл, 
((CDbl(Приход_к)+CDbl(Приход_б))-(CDbl(Расход_к)+CDbl(Расход_б))) AS Доход_р
FROM (((Orders AS t LEFT JOIN Cash ON t.[Реф №] = Cash.[Реф №]) LEFT JOIN Bank ON t.[Реф №] = Bank.[Реф №])
LEFT JOIN Realization ON t.[Реф №] = Realization.[Реф №]) LEFT JOIN Calc ON t.[Реф №] = Calc.[Реф №]
GROUP BY t.[Реф №], t.Наименование, t.Потребитель, nz(t.Эквивалент, 0 ), t.Количество;

Работает очень быстро, но появляется проблема из-за которой я и завел этот топик: значения больше реальных в 12 раз (это не постоянное число раз). Причем, чем меньше "Join'ов" тем в меньшее число раз полученное значение превышает реальное
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338716
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я немного не об этом ;)
Можно же сделать для каждой из нужных таблиц _отдельный_ запрос с группировкой по нужному полю, например:
Код: plaintext
1.
SELECT [Реф №], Sum(bank.Эквивалент1) AS E1, Sum(bank.Эквивалент2) AS E2
FROM bank GROUP BY [Реф №]

и соединить его через RIGHT JOIN с основной таблицей!
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338733
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таком случае нужно заводить массу хранимых запросов, а мне желательно сделать это все в программе (этот запрос служит для открытия рекордсета).
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338742
Фотография AlexJuice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для данного запроса получится всего три запроса (по одному к каждой вспомогательной таблице). И, между прочим, сохраненные запросы должны поднять быстродействие.
ИМХО здесь не получится "и рыбку съесть, и..."
Впрочем, наше дело предложить... Других выходов все равно не предвидится, так что решай сам. Мне больше предложить нечего.
Кстати, я бы отказался от такого наименования поля как "№ реф".
...
Рейтинг: 0 / 0
Дублирование данных в запросе
    #32338743
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все отлично работает. Спасибо
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Дублирование данных в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]