Главная страница
    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.059 c
2-1176390478
Juice
2007-04-12 19:07
2007.04.29
Format и символ %


2-1176190517
Катеринка
2007-04-10 11:35
2007.04.29
Обработка нажатий клавиш всех процессов


15-1175637157
SerJaNT
2007-04-04 01:52
2007.04.29
Положение через random


15-1175802908
ProgRAMmer Dimonych
2007-04-05 23:55
2007.04.29
Подскажите, как реализовать...


2-1175886508
Frozen
2007-04-06 23:08
2007.04.29
Выравнивание текста по щирине





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