Запрос обратный перекрестному

vlsx
Дата: 17.01.2012 19:09:56
Есть такая задача. В таблице А2/01/1/02 имеется исходная информация. На основе ее с помощью перекрестного запроса формируется запрос A2/01/1/03. На основе значений полей с кодами А… вычисляется информация с кодами В… (А2/01/1/04) Необходимо информацию из запроса А2/01/1/04 представить в виде таблицы А2/01/1/02. Одним словом необходима функция запроса обратная функции перекрестного запроса. Если есть прямое преобразование перекрестного запроса, остается предположить, что есть и обратное преобразование. Прошу помощи в этом вопросе.
Hезабайнин
Дата: 17.01.2012 19:32:27
vlsx
Есть такая задача. В таблице А2/01/1/02 имеется исходная информация. На основе ее с помощью перекрестного запроса формируется запрос A2/01/1/03. На основе значений полей с кодами А… вычисляется информация с кодами В… (А2/01/1/04) Необходимо информацию из запроса А2/01/1/04 представить в виде таблицы А2/01/1/02. Одним словом необходима функция запроса обратная функции перекрестного запроса. Если есть прямое преобразование перекрестного запроса, остается предположить, что есть и обратное преобразование. Прошу помощи в этом вопросе.

Картинка с другого сайта.

не понятно
mds_world
Дата: 17.01.2012 19:37:25
vlsx
Есть такая задача. В таблице А2/01/1/02 имеется исходная информация. На основе ее с помощью перекрестного запроса формируется запрос A2/01/1/03. На основе значений полей с кодами А… вычисляется информация с кодами В… (А2/01/1/04) Необходимо информацию из запроса А2/01/1/04 представить в виде таблицы А2/01/1/02. Одним словом необходима функция запроса обратная функции перекрестного запроса. Если есть прямое преобразование перекрестного запроса, остается предположить, что есть и обратное преобразование. Прошу помощи в этом вопросе.

Есть такая функция!

Смотрите Union, Union All
ПЕНСИОНЕРКА
Дата: 18.01.2012 00:20:38
vlsx,

похоже на вычисления типа

B1=A1*A2
B2=B1*A3
vlsx
Дата: 18.01.2012 06:07:49
Формула вычисления не принципиальна, и взята для примера. Суть по прежнему остается следующей. Есть таблица исходной информации, где все коды и их значения хранятся построчно. Такой вид информации удобно представлять в формах, где количество представленной информации не зависит от структуры формы и может быть сколь угодно большой. Запрос, вычисляющий значения на основе вводной информации, тоже не представляет больших трудностей. Трудность возникает при выводе расчетной информации в форме. Вернее рост новых кодов и их значений связан с появлением новых полей в форме, а не с ростом строк формы. При увеличении расчетной информации приходится добавлять новые поля.
vlsx
Дата: 18.01.2012 06:11:39
Есть такая функция!

Смотрите Union, Union All[/quot]

И как эти функции работают в связи с данной задачей? На сколько я знаю это операторы объединения таблиц или запросов со сходной структурой.
hgfdsa
Дата: 18.01.2012 06:42:13
vlsx
Формула вычисления не принципиальна ...

Да не скажите. Уверен, что в большинстве случаев можно получить результат, минуя перекрестные запросы. Например, если верно предположение ПЕНСИОНЕРКА и ваш пример является репрезентативным, то требуемый результат можно получить так
SELECT Q1.E1, 'B' & Count(*) AS B, 
       Exp(Sum(Log(Abs(IIf(Nz(Q2.X,0)=0,1,Q2.X)))))*
       IIf(Sum(IIf(Nz(Q2.X,0)<0,1,0)) Mod 2=0,1,-1)*
       IIf(Sum(IIf(Nz(Q2.X,0)=0,1,0))>0,0,1)*Nz(First(Q1.X),0) AS X1
FROM Q AS Q1 INNER JOIN Q AS Q2 ON (Q1.E1=Q2.E1) AND (Q1.A2 > Q2.A2)
GROUP BY Q1.E1, Q1.A2

здесь Q-сохраненный запрос
SELECT E1, A2, Sum(X1) AS X
FROM [А2/01/1/02]
GROUP BY E1, A2

В первом запросе использованы сведения из поста 3528720 BoNiM

vlsx
И как эти функции работают в связи с данной задачей? На сколько я знаю это операторы объединения таблиц или запросов со сходной структурой.

SELECT E1, 'B1' As B, B1 As X1 FROM [А2/01/1/04]
UNION ALL
SELECT E1, 'B2', B2 FROM [А2/01/1/04]
UNION ALL
SELECT E1, 'B3', B3 FROM [А2/01/1/04]
....
vlsx
Дата: 18.01.2012 16:48:26
SELECT E1, 'B1' As B, B1 As X1 FROM [А2/01/1/04]
UNION ALL
SELECT E1, 'B2', B2 FROM [А2/01/1/04]
UNION ALL
SELECT E1, 'B3', B3 FROM [А2/01/1/04]
....


Благодарю. Вышеуказанный запрос решает задачу. Правда решение не совсем универсальное – приходится иметь жесткий список вычисляемых полей по кол-ву. Например список из 50-100 вычисляемых полей, где для занятых полей вписаны формулы, а для не занятых нулевые значения. По мере роста объемов вычислений нулевые значения меняются на формулы.
hgfdsa
Дата: 18.01.2012 18:02:46
vlsx
... приходится иметь жесткий список вычисляемых полей по кол-ву. Например список из 50-100 вычисляемых полей, где для занятых полей вписаны формулы, а для не занятых нулевые значения. По мере роста объемов вычислений нулевые значения меняются на формулы.

Объединение запросов при помощи UNION имеет ограничение на количество запросов, входящих в объединение, см. пост 5489361 и следующий за ним.
Для эксперимента рассмотрел запрос
SELECT E1, A2, X1 FROM [А2/01/1/02]
UNION All
SELECT E1, A2, X1 FROM [А2/01/1/02]
UNION All

....

SELECT E1, A2, X1 FROM [А2/01/1/02]

На моем компе (Ассess 2003) при количестве объединяемых запросов <=50 запрос отрабатывал нормально, а при большем возникала ошибка "Слишком сложный запрос". Поэтому при большом количестве полей вам прийдется принимать некоторые меры, чтобы обойти это ограничение.
Вы так никак и не прокомментировали
hgfdsa
... можно получить результат, минуя перекрестные запросы

В данной ситуации, как мне кажется, это решение было бы намного рациональнее решения с перекрестными запросами. Можно было бы вообще не заморачиваться с запросами, а решать задачу проходом по некоему RecordSet-у и формированием итоговой таблицы.
vlsx
Дата: 22.01.2012 16:45:23
По поводу

hgfdsa
... можно получить результат, минуя перекрестные запросы


С перекрестными запросами мне легче. Исходная информация из строчной переводится в столбцовую форму. Далее в визуальном конструкторе запроса, на основе исходной информации, отрабатываются формулы. Далее результаты обратно переводятся в строчную форму. Исходный и конечный вид информации в виде строк удобен при выводе информации в форме. А применение промежуточной формы, в виде конструктора запроса для редактирования формул, удобен для работы для не квалифицированного персонала на программе. Программа изначально для этого и создается. Дается инструмент, а конкретный пользователь с помощью редактирования списка исходной и конечной информации, а так же редактированием формул подстраивает ее под себя. Конечно есть соблазн разместить формулы в каком-нибудь поле таблицы, с автоматической их обработкой, например в результате их переноса в поля вычисляемого запроса – но как это сделать пока не знаю.