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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
15-1175260410
Reaktor
2007-03-30 17:13
2007.04.29
Если свич воткнуть в свич


2-1176037710
pound
2007-04-08 17:08
2007.04.29
В редакторе TValueListEditor в событии OnValidate проверяю


15-1175355393
Reactor
2007-03-31 19:36
2007.04.29
Доудаление касперского


15-1175714512
X-ecuto[rus]
2007-04-04 23:21
2007.04.29
Есть ли какое-нибудь


2-1175983376
Василий Кузнецов
2007-04-08 02:02
2007.04.29
.html