Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизЗагадочный вопрос по SQL (ХП) Найти похожие ветки
← →
Coder (2004-04-15 01:03) [0]Мастера, подскажите, пожалуйста:
CREATE PROCEDURE REPORT1 (
STARTDATE DATE,
ENDDATE DATE)
RETURNS (
DIVISION CHAR(15),
OUT1 INTEGER,
OUT2 INTEGER,
OUT3 INTEGER,
OUT4 INTEGER,
OUT5 INTEGER,
OUT6 INTEGER,
/* .... ещё много параметров */
OUT20 INTEGER )
AS
DECLARE VARIABLE CODE SMALLINT;
BEGIN
FOR
SELECT division_tab.text, division_tab.division
FROM division_tab ORDER BY text
/* не могу понять, можно ли сюда добавить TEXT, которого НЕТ в division_tab,
просто нужно одно из существующих подразделений (division) разделить на 2 подразделения и
посчитать по каждому количество ОТДЕЛЬНО*/
INTO :division, :code
DO
BEGIN
SELECT COUNT(card_N) FROM cards
WHERE (profile=:code) AND (in_date_TIME BETWEEN :startdate AND :enddate)
INTO OUT1;
SELECT COUNT(card_N) FROM cards
WHERE (profile=:code) AND (type0="1") AND
(in_date BETWEEN :startdate AND :enddate)
INTO OUT2;
SELECT COUNT(card_N) FROM cards
WHERE (profile=:code) AND (type0="0") AND
(in_date BETWEEN :startdate AND :enddate)
INTO OUT3;
SELECT COUNT(card_N) FROM cards
WHERE (profile=:code) AND (type0="2") AND
(in_date BETWEEN :startdate AND :enddate)
INTO OUT4;
SELECT COUNT(card_N) FROM cards
WHERE (data1=:code) AND (CAST(type0 AS SMALLINT)>2) AND
(in_date BETWEEN :startdate AND :enddate)
INTO OUT5;
SELECT COUNT(card_no) FROM cards
WHERE (data2=:code) AND (in_date BETWEEN :startdate AND :enddate)
INTO OUT6;
/*................................................................
.................................................................*/
SELECT COUNT(card_no) FROM cards
WHERE (data3=:code) AND (type0="1") AND
(in_date BETWEEN :startdate AND :enddate)
INTO OUT20;
SUSPEND;
END
END
А теперь ещё один маленький вопрос:
можно ли как-то просчитать ЭТО всё быстрее, чтобы не делать каждый раз "AND (in_date BETWEEN :startdate AND :enddate)" или может быть как-нибудь ещё оптимизировать эту процедуру?
Или отказаться от хранимой процедуры и обрабатывать всё на клиенте?
Что посоветуете, Мастера? Заранее благодарен за все ответы!
← →
ЮЮ © (2004-04-15 02:46) [1]>просто нужно одно из существующих подразделений (division) разделить на 2 подразделения и посчитать по каждому количество ОТДЕЛЬНО
И как ты собираешься это сделать, если в cards.profile стоит КОД только одного подразделения?
>чтобы не делать каждый раз "AND (in_date BETWEEN :startdate AND :enddate)" ...
1) сделать ключи по полям, участвующим в WHERE
или
2)
Cделать одну выборку по profile=:code
SELECT type0 FROM cards
WHERE (profile=:code) AND
(in_date BETWEEN :startdate AND :enddate)
INTO type0
и одну по data1...data3
SELECT type0, data1, data2, data3 FROM cards
WHERE ((data1=:code) OR (data2=:code) OR (data3=:code)) AND
(in_date BETWEEN :startdate AND :enddate)
INTO type0, data1, data2, data3
И, пробегая записи и анализируя type0,[data1, data2, data3], увеличивать нужные OUTxx
← →
Coder (2004-04-16 21:54) [2]ЮЮ © (15.04.04 02:46) [1]
Спасиб БОЛЬШОЕ, вродь разобрался... :-)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.039 c