Главная страница
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.036 c
1-1083504252
RainKM
2004-05-02 17:24
2004.05.16
Компонент DriveComboBox


6-1080487828
iu2320
2004-03-28 19:30
2004.05.16
Shared resources


9-1071409745
ZAROLF
2003-12-14 16:49
2004.05.16
Нужен совет к 2D аркаде!


3-1082557469
AMB
2004-04-21 18:24
2004.05.16
Отчет из Delphi7 в Word-97


1-1083401859
pd
2004-05-01 12:57
2004.05.16
Как программно создать таймер?