Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Загадочный вопрос по 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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.024 c
1-1083080832
volser
2004-04-27 19:47
2004.05.16
Написание класса


14-1082821801
Maxim Vetera
2004-04-24 19:50
2004.05.16
Самая заветная мечта!


4-1080229053
cherrex
2004-03-25 18:37
2004.05.16
wh_JournalRecord


1-1083160234
KEBZ
2004-04-28 17:50
2004.05.16
DLL


4-1075492917
Xerx
2004-01-30 23:01
2004.05.16
создать виртуальный диск