Предложение INTO TEMP является последним - должно идти после предложений FROM, WHERE, GROUP BY и HAVING.Он не может появиться с ORDER BY, но будет и после этого.
Следовательно (используя в качестве примера только первый запрос):
select count(*) AS counter, -- Aggregates or expressions must be named
pwd_trx_date,
pwd_trx_type,
pwd_last_type,
pwd_last_amt,
pwd_pawn_amt,
pwd_cob1,
pwd_cob2,
pwd_cob3,
pwd_cob4
from boletos
where pwd_trx_date >= $sfecha
and pwd_trx_date <= $efecha
and pwd_trx_type = "E"
and pwd_last_type = "R"
INTO TEMP r;
Если, как представляется, вам нужно большестолбцы переименовываются, затем:
select count(*) AS rcount,
pwd_trx_date AS rtrxdate,
pwd_trx_type AS trxtype,
pwd_last_type AS rlasttype,
pwd_last_amt AS rlastamt,
pwd_pawn_amt AS rpawnamt,
pwd_cob1 AS rcob1,
pwd_cob2 AS rcob2,
pwd_cob3 AS rcob3,
pwd_cob4 AS rcob4
from boletos
where pwd_trx_date >= $sfecha
and pwd_trx_date <= $efecha
and pwd_trx_type = "E"
and pwd_last_type = "R"
INTO TEMP r;
Ответ на ваш вопрос «как выглядит итоговый SELECT» зависит от того, какой отчет предполагается создать.Я взял копию всего отчета (253 строки), применил некоторое минимальное переформатирование и сократил его до 193 строк (предложение GROUP BY в одной строке; используйте pwd_trx_date BETWEEN $sfecha AND $efecha
для диапазона дат).
У вас есть 6 временных таблиц, все из которых выбираются из одной и той же таблицы Boletos, с одинаковым диапазоном дат и с разными наборами критериев в полях pwd_trx_type
и pwd_last_type
.К сожалению, эти 6 запросов содержат 3 разных набора столбцов группировки и столько разных полей.
Не ясно, следует ли объединять эти результаты с UNION или набором объединений.
Если ответом является UNION, вам нужно убедиться, что все промежуточные таблицы имеют одинаковое количество столбцов с 'r' (временная таблица с наибольшим количеством столбцов), или вам придется написать свой UNION с пустыми полямипредусмотрены для каждой из «узких» таблиц в соответствии с «самой широкой» таблицей.
Если ответом является JOIN, вам необходимо определить условия соединения - те из нас, кто не знаком с вашей СУБД, имеют нулевой шансправильное соединение.
Каким бы ни был ответ (JOIN или UNION), вам также понадобится предложение ORDER BY в SELECT.Это будет контролировать порядок представления данных в отчете.
Ваши предложения 'BEFORE GROUP OF' и 'AFTER GROUP OF' могут перечислять только одну переменную одновременно.Эти переменные должны быть в предложении ORDER BY последнего SELECT.
Это выглядит так, как будто вы хотите объединить 6 отдельных отчетов: один отчет с использованием временной таблицы r;затем использовать временную таблицу «i», затем «f» и т. д. Это не та структура, которая позволяет легко создавать отчеты ACE.Лучше всего иметь 6 отдельных отчетов, каждый из которых записан в отдельный файл, а затем объединить (объединить) эти отдельные отчеты.Вероятно, вы бы договорились о том, чтобы даты предоставлялись в качестве аргументов, а не входных данных, поэтому пользователь обязан вводить даты только один раз, но скрипт управляющей оболочки запускает 6 отчетов с теми же двумя датами, что и для параметров.
Учитывая временную таблицу 'r', показанную выше, форматирование вывода, связанное с этим (на ваш взгляд - к сожалению, ACE имеет другое представление о вещах):
AFTER GROUP OF
rtrxdate,
rtrxtype,
rlasttype,
rlastamt,
rpawnamt,
rcob1,
rcob2,
rcob3,
rcob4
PRINT COLUMN 1,"CANTIDAD INGRESOS TOTAL GANANCIA"
PRINT COLUMN 1,"-------- --------- ------- --------"
PRINT COLUMN 2,GROUP TOTAL OF rcount USING "###,###",
COLUMN 10,"RETIROS",
COLUMN 20,GROUP TOTAL OF rlastamt "###,###",
COLUMN 42,(
(GROUP TOTAL OF rcob1) +
(GROUP TOTAL OF rcob2) +
(GROUP TOTAL OF rcob3) +
(GROUP TOTAL OF rcob4)
) -
(GROUP TOTAL OF rpawnamt) USING "###,###"
Большинство других разделов форматированиячем-то похожи - у них одинаковые четыре столбца.Два раздела имеют всего 3 столбца.Я думаю, что вы захотите структурировать свой запрос как запрос UNION.Я думаю, это означает, что вы будете пересматривать свою основную серию запросов следующим образом:
SELECT COUNT(*) AS rcount,
pwd_trx_date AS rtrxdate,
pwd_trx_type AS rtrxtype,
pwd_last_type AS rlasttype,
"RETIROS" AS rlabel,
1 AS rsequence,
SUM(pwd_last_amt) AS rcol3,
(SUM(pwd_cob1) + SUM(pwd_cob2) + SUM(pwd_cob3) + SUM(pwd_cob4) -
SUM(pwd_pawn_amt) AS rcol4
FROM boletos
WHERE pwd_trx_date BETWEEN $sfecha AND $efecha
AND pwd_trx_type = "E"
AND pwd_last_type = "R"
GROUP BY rtrxdate, rtrxtype, rlasttype
INTO TEMP r;
Другие ваши запросы будут производить такое же количество столбцов.Последовательность гарантирует, что строки из 'r' появятся перед строками из 'i' (у которых будет rsequence = 2) и 'f' (у которых будет rsequence = 3) и так далее.Значения rlabel позволяют вам правильно напечатать заголовок.
После этого ваш UNION сможет выполнить:
SELECT * FROM r
UNION
SELECT * FROM i
UNION
...
SELECT * FROM c
ORDER BY rsequence, rtrxdate, rtrxtype, rlasttype
Тогда ваш раздел FORMAT будет содержать:
PAGE HEADER
PRINT COLUMN 1,"CANTIDAD INGRESOS TOTAL GANANCIA"
PRINT COLUMN 1,"-------- --------- ------- --------"
BEFORE GROUP OF rsequence
SKIP 1 LINE
ON EVERY ROW
PRINT COLUMN 2, rcount USING "###,###",
COLUMN 10, rlabel,
COLUMN 20, rcol3,
COLUMN 42, rcol4
Поскольку в двух группах у вас нет «реального» значения для rcol4 - вы, вероятно, просто выберете 0 или SUM (0) в качестве фиктивного столбца для них, вместо этого вам может потребоваться:
ON EVERY ROW
IF rsequence <= 4 THEN
PRINT COLUMN 2, rcount USING "###,###",
COLUMN 10, rlabel,
COLUMN 20, rcol3,
COLUMN 42, rcol4
ELSE
PRINT COLUMN 2, rcount USING "###,###",
COLUMN 10, rlabel,
COLUMN 20, rcol3
Впрочем, теперь ты сам по себе.