Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.036 c
1-1083160234
KEBZ
2004-04-28 17:50
2004.05.16
DLL


1-1083153374
bond
2004-04-28 15:56
2004.05.16
Как вызвать метод класса для всех объектов этого класса


7-1081237441
viperm
2004-04-06 11:44
2004.05.16
IDE current transfer mode


4-1080212684
S@shka
2004-03-25 14:04
2004.05.16
Дубль вопрос: Conslose Thread


1-1083709932
spogi
2004-05-05 02:32
2004.05.16
Block in XP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский