Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2013, 17:01   #1
Vub
 
Регистрация: 17.05.2013
Сообщений: 5
По умолчанию объединение запросов

Здравствуйте!
Почему-то не получается вроде бы простая задача:
Есть два запроса. Значения полей, которыми эти запросы связаны, повторяются. Но в 1-м запросе меньше повторений, чем во 2-м.

Как объединить эти два запроса в третий так, чтобы количество записей было равно количеству записей в 1-м запросе (где меньше повторений)?

Пробовал имитировать счетчик в 1-м запросе и ставить distinct в результирующем. Не помогает. (Имитация счетчика благополучно повторяется).
Vub вне форума Ответить с цитированием
Старый 17.05.2013, 17:40   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Как объединить эти два запроса в третий так,
Код:
select q1.*, q2.*  from q1
1.  inner join q2 on q1.xx =q2.xx //только общие
2.  left join q2 on q1.xx =q2.xx //все из q1 дополнить если возможно из q2
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.05.2013 в 17:43.
evg_m вне форума Ответить с цитированием
Старый 17.05.2013, 20:58   #3
Vub
 
Регистрация: 17.05.2013
Сообщений: 5
По умолчанию

Ну, с джоинами я, положим, немного знаком.
Есть еще идеи?
Изображения
Тип файла: jpg особенность разгруппировок.jpg (87.9 Кб, 141 просмотров)
Vub вне форума Ответить с цитированием
Старый 17.05.2013, 21:07   #4
Vub
 
Регистрация: 17.05.2013
Сообщений: 5
По умолчанию

забыл пояснить изображение:
слева и справа два исходных запроса, по центру - то, что получается. Как видите, получается в два раза больше записей, чем надо. (left join, естественно, вставлен).
Vub вне форума Ответить с цитированием
Старый 17.05.2013, 22:26   #5
Teslenko_EA
Участник клуба
 
Регистрация: 10.08.2009
Сообщений: 1,796
По умолчанию

Здравствуйте Vub.
"..не получается вроде бы простая задача..", "..с джоинами я .. немного знаком.."
"..Есть еще идеи?.." - для решения Вашей задачи нужны не идеи, а логика.
Результат (средняя таблица на картинке) абсолютно верно отображает набор записей связанных по полю [Товар код].
При такой связи каждому номеру проводки левой таблицы будет соответствовать два номера проводки правой
(конечно подразумевается уникальность записей в правой - Distinct)
Если необходимо выбрать только одно значение примените агрегатную функцию получив из правой таблицы
первое, последнее, максимальное или минимальное значение.
(First, Last, Max, Min - надеюсь с ними Вы так-же знакомы).

Успехов Вам.
Евгений.
Teslenko_EA вне форума Ответить с цитированием
Старый 20.05.2013, 17:43   #6
Vub
 
Регистрация: 17.05.2013
Сообщений: 5
По умолчанию

Здравствуйте, Евгений.
Должен сказать, что "в Акцессе" я недавно, поэтому - чуть более сложная задачка - и логика программы, действительно, начинает от меня ускользать.

Меня терзают смутные сомнения по поводу применения предложенных Вами функций к данному случаю. Дело в том, что передо мной сейчас стоит задача подсчета прибыли в условиях изменения цен. Т.е. мне надо соотнести продажи к закупкам поштучно. Я отсортировал операции ("проводки") покупок, отсортировал продажи, "разгруппировал" их по количеству (т.е. каждая запись - единица товара).
И вот теперь эти две разгруппировки мне надо "склеить" соответствующим образом для подсчета разниц в ценах закупки и продажи.
Группировка правой таблицы (если я правильно Вас понял) здесь, имхо, не годится. Из нее надо взять столько записей, сколько было продано единиц соответствующего товара (по порядку, ФИФО), а остальное - отбросить.

У Вас, похоже, опыта гораздо поболе моего. Что-то можете присоветовать?
Спасибо.
Vub вне форума Ответить с цитированием
Старый 21.05.2013, 11:00   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
"разгруппировал" их по количеству (т.е. каждая запись - единица товара).
добавь теперь к ним НУМЕРАЦИЮ (пересчитать записи).

теперь тоже самое (разгруппировка до отдельных + нумерация) для покупок.
А теперь самое время все отдельные покупки и все отдельные продажи inner join по "порядковому" номеру. А потом суммирование и нахождение разницы (или же наоборот сначала разница потом суммирование).

а вообще для таких задач удобнее работать(вычислять) на клиенте (в программе с использованием цикла!).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 21.05.2013, 14:00   #8
Vub
 
Регистрация: 17.05.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
добавь теперь к ним НУМЕРАЦИЮ (пересчитать записи).
Дак вроде добавил уже (Счетчик). Или надо что-то другое?

Цитата:
Сообщение от evg_m Посмотреть сообщение
А теперь самое время все отдельные покупки и все отдельные продажи inner join по "порядковому" номеру.
По нумерации?! Я на всякий случай попробовал, и не получил ни одной записи. Что Вы имеете в виду?
Цитата:
Сообщение от evg_m Посмотреть сообщение
а вообще для таких задач удобнее работать(вычислять) на клиенте (в программе с использованием цикла!).
Это - да. Но с ним еще познакомиться надо. А пока надо хоть что-то, хоть как-то.

P.S. Надеюсь, очевидно, что Товар_Код 765 - далеко не единственный. (На скрине - результат фильтра по этому номеру для наглядности).

SELECT DISTINCT Разгруппировка_продаж_счетчик.Счетч ик, Разгруппировка_продаж_счетчик.Товар _Код, Разгруппировка_продаж_счетчик.Опера ция_Товар_Код, Разгруппировка_продаж_счетчик.Цена, Разгруппировка_закупок_счетчик.Цена , Разгруппировка_закупок_счетчик.Опер ация_Товар_Код
FROM Разгруппировка_закупок_счетчик INNER JOIN Разгруппировка_продаж_счетчик ON Разгруппировка_закупок_счетчик.Счет чик = Разгруппировка_продаж_счетчик.Счетч ик;

Последний раз редактировалось Vub; 21.05.2013 в 14:04.
Vub вне форума Ответить с цитированием
Старый 23.05.2013, 12:09   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

так давайте так.
1. исходные таблицы (продажи/покупки) безо всяких группировок/разгруппировок.
2. проверим постановку задачи.
есть две таблицы (1 покупки; 2 продажи )
надо в покупках набрать такое же количество товара какое есть во всех продажах (для данного товара).
после это определить разницу
сумма отобранной покупки - сумма всей продажи.


Цитата:
По нумерации?! Я на всякий случай попробовал, и не получил ни одной записи. Что Вы имеете в виду?
Код:
select tvr, q,c,summ, 
 ( select count(tvr) from prihod as ps where ps.id_p<prihod.id_p and ps.tvr=prihod.tvr ) as nn //  вот это я называю пронумеровать 
from prihod
последовательная начинающаяся с нуля и без пропусков нумерация "на лету" всех НУЖНЫХ записей.

Код:
select r.*, p.*
from ( select tvr, q,c,summ, 
           (select count(tvr) from rashod as rs where rs.id_p<rashod.id_p) as nn 
         from rashod ) as r
inner join ( select tvr, q,c,summ, 
                    (select count(tvr) from prihod as ps where ps.id_p<prihod.id_p) as nn 
                 from prihod ) as p
on r.nn =p.nn // сборка по нумерации
а далее разность и сумма в любом порядке

НЕ ЗНАЮ позволит ли такое Access.


А вообще говоря Access это не только SQL. Но еще и программа в т.ч. циклы и возможность навигации по НД (переход от одной записи к другой).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 23.05.2013 в 12:38.
evg_m вне форума Ответить с цитированием
Старый 23.05.2013, 13:46   #10
shanemac51
Участник клуба
 
Аватар для shanemac51
 
Регистрация: 12.08.2010
Сообщений: 1,077
По умолчанию

может так получится
Код:
SELECT wwwww1.[Товар код], wwwww1.Счетчик, wwwww1.[№ проводки], First(wwwww2.[№ проводки]) AS [First-№ проводки1]
FROM wwwww1 LEFT JOIN wwwww2 ON wwwww1.[Товар код] = wwwww2.[Товар код]
GROUP BY wwwww1.[Товар код], wwwww1.Счетчик, wwwww1.[№ проводки]
ORDER BY wwwww1.[Товар код];
Имя-Галина== почта shanemac51@yandex.ru скайп shanemac51 c 8-15мск будни
Сфера интересов--word-excel-access-распознавание
shanemac51 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение запросов maksden Microsoft Office Access 7 26.02.2013 21:46
Объединение двух запросов Xakand_2009 БД в Delphi 4 10.07.2012 15:05
Объединение двух запросов KBO БД в Delphi 0 27.07.2011 02:25
объединение SCQ запросов mad_dog4 БД в Delphi 4 06.12.2010 14:13
Объединение 2-х запросов SlavaSH БД в Delphi 6 28.12.2009 10:08