Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];

Вниз

Хранимая процедура : выбор записей + количество по полю   Найти похожие ветки 

 
valua   (2007-02-07 17:56) [0]

Господа , здравствуйте !
Вопрос такой . Необходимо выбрать записи и подсчитать количество записей для поля К_СЕХ , т.е. должно быть так
------------------------------------
 K_CEX           count(k_cex)
------------------------------------
  5                    20
  10                   25
  50                  40
  66                  10

и т. д.

Все примеры даны для запросов . Мне хотелось бы написать хранимую процедуру . Текст процедуры ниже :

BEGIN
for SELECT
            p.KOD,
            p.KOD_LK,
            p.K_CEX,
            p.K_KAT,
            p.K_PROF,
            p.K_OSN,
            p.PRIZ,
            count(k_cex)
    FROM PEREM P
     where ((p.priz = :priz1) and ((p.k_osn = :k_osn1) or (p.k_osn = :k_osn2)))
     group by p.k_cex
      INTO
          :KOD,
          :KOD_LK,
          :K_CEX,
          :K_KAT,
          :K_PROF,
          :K_OSN,
          :PRIZ,
          :kol   /*   для count */
do suspend;                  
END

дает ошибку :
invalid column reference.

Господа в чем причина , как правильно написать хранимую процедуру ?
Только не надо лишних вопросов , типа - зачем это надо , прошу конретных ответов .
Всем спасибо .


 
Johnmen ©   (2007-02-07 18:02) [1]

Причина в незнании команды SELECT в части группировки (GROUP BY).
А именно, группировать можно только по полям, указанным в списке выбираемых. Иначе, как, напр., у тебя, это абсурдно, т.е. лишено всякого смысла...


 
valua   (2007-02-09 18:23) [2]

> Johnmen ©   (07.02.07 18:02) [1]
Причина в незнании команды SELECT в части группировки (GROUP BY).
А именно, группировать можно только по полям, указанным в списке выбираемых. Иначе, как, напр., у тебя, это абсурдно, т.е. лишено всякого смысла...

Причина была не в незнании команды SELECT в части группировки (GROUP BY) , а языке хранимых процедур , если бы я знала , то не задавала бы вопросы . В хранимых процедурах несколько иная запись такого запроса и все имеет смысл .
Все хорошо получается если делаю по одного условия , а если совмещаю
два условия не могу обнулить суммы , пример  :
результат выполнения процедуры ->
--------------------------------------------------------------------------
K_CEX           count(k_cex) - 1 условие      count(k_cex) - 2 условие
---------------------------------------------------------------------------
 5                    20                                         20
 10                   25                                        25
 50                  40                                         40
 66                  10                                         10
 83                  2                                           5

а должно быть ->
--------------------------------------------------------------------------
K_CEX           count1(k_cex) - 1 условие      count2(k_cex) - 2 условие
---------------------------------------------------------------------------
 5                    20                                         0
 10                  25                                         0
 50                  0                                          40
 66                  10                                         0
 83                  2                                           5

если при 1 условии сумма = 0 , то в count1(k_cex) - 1 условие должен был быть 0 и наоборот .    

Процедура :

BEGIN
 FOR SELECT distinct PQ.K_CEX
   FROM PEREM PQ,
 perem_prin(:k_osn1,:k_osn2,:PER1,:PER2,:PRIZ1,:PRIZ2,:K_REG1) PR, - 1 услов
 perem_uvol(:k_osn3,:k_osn4,:PER1,:PER2,:PRIZ1,:PRIZ2,:K_REG1) PU - 2 усл
   where (PQ.k_cex = PU.K_CEX) or (Pq.k_cex = PR.K_CEX)
   into :k_cex
  DO
  BEGIN
/*   - 1 условие  */
   SELECT P1.KOD
          P1.K_CEX,
          P1.KOL_CEX
     FROM perem_prin_count(:k_osn1,:k_osn2,:PER1,:PER2,:PRIZ1,:PRIZ2,:K_REG1) P1
     where (P1.k_cex = :k_cex)
     INTO :KOD,
           :K_CEX,
           :kol_cex;
   if (KOL_CEX is null) then KOL_CEX = 0;  -  пробовала всталять эту строку - не работает
/*  2 условие  */
   SELECT P.KOD,
          P.K_CEX,
          P.KOL_CEXU
     FROM perem_uvol_cou_cex(:k_osn3,:k_osn4,:PER1,:PER2,:PRIZ1,:PRIZ2,:K_REG1) P
     where (P.k_cex = :k_cex)
     INTO :KOD,
           :K_CEX,
            :kol_cexu;
    if (KOL_CEXU is null) then KOL_CEXU = 0; -  пробовала всталять эту строку - не работает

    SUSPEND;
  END
END

Господа , может быть кто-то сталкивался с такой проблемой , как мне правильно записать в хранимой процедуре , чтобы выполнялось условие , где сумма 0 - в результате выполнения тоже 0 .
Всем спасибо .

P. S.   просьба отвечать по существу без ответов по типу предыдущего , если бы я знала , то не задавала бы вопрос .


 
Desdechado ©   (2007-02-09 18:30) [3]

> В хранимых процедурах несколько иная запись такого запроса и все имеет смысл
"Запись" запросов там абсолютно одинаковая.

PS Если данных нет, то SELECT INTO не очищает переменную. Поэтому ее нужно очищать заранее.


 
Johnmen ©   (2007-02-09 18:32) [4]


> Причина была не в незнании команды SELECT в части группировки
> (GROUP BY) , а языке хранимых процедур

Блажен, кто верует.
ЗЫ
Кстати, СУБД почему-то до сих пор не озвучена.


 
Desdechado ©   (2007-02-09 18:40) [5]

Johnmen ©   (09.02.07 18:32) [4]
Судя по синтаксису, какой-то из IB-клонов. ORA ведет себя иначе в SELECT INTO.


 
Johnmen ©   (2007-02-09 18:46) [6]


> Desdechado ©   (09.02.07 18:40) [5]

Да-да. Даже телепатор самой простой конструкции говорит о том же :)
И что меня улыбает, так это безапелляционная уверенность некоторых вопрошающих в своих "знаниях". Откуда только они их берут?????


 
Val ©   (2007-02-09 19:03) [7]

>[6] Johnmen ©
сейчас тебя еще раз поругают :)


 
Johnmen ©   (2007-02-09 19:17) [8]


> Val ©   (09.02.07 19:03) [7]
> сейчас тебя еще раз поругают :)

Обычное дело, я уже привык...:)
Поругать-то проще, чем открыть учебник или просто элементарно подумать...


 
valua   (2007-02-12 09:04) [9]

Desdechado ©   (09.02.07 18:30) [3]
> В хранимых процедурах несколько иная запись такого запроса и все имеет смысл
"Запись" запросов там абсолютно одинаковая.

PS Если данных нет, то SELECT INTO не очищает переменную. Поэтому ее нужно очищать заранее

Спасибо , обнулила в вызываемой процедуре и все получилось .

P. S.  Я не отрицаю , что другие мастера такие гении в программировании , но зачем же дурачить других .
Если бы мы все знали , если бы мы были такими же гениями , то не обращались бы к вам . Если человек знал о чем идет речь , он все понял и дал ответ по существу .


 
ЮЮ ©   (2007-02-12 10:06) [10]


> , но зачем же дурачить других .


Вот именно!!! Зачем приводить процедуру в [0], если нужно исправить процедуру в [2], в которой никаких count(k_cex) нет ?



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.042 c
3-1171031359
ANB
2007-02-09 17:29
2007.04.29
(Оракл) Как заставить вьюху слопать нужный мне тип ?


1-1172743566
linox
2007-03-01 13:06
2007.04.29
к текущему времени добавить число


15-1175604524
Post_
2007-04-03 16:48
2007.04.29
Ноут.


2-1176324701
ppcumax
2007-04-12 00:51
2007.04.29
Как использовать свое Popupmenu в WebBrowser?


15-1175158476
Альберт
2007-03-29 12:54
2007.04.29
Уменьшить размер EXE





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский