Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с хранимой процедурой, максимальное число записей 
:(
    Опции темы
DestinyStar
  Дата 9.1.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 28.5.2008

Репутация: нет
Всего: нет



Помогите пожалуйста исправить хранимую процедуры, написать с помощью запросов нельзя, так как задание другое. 
Задание: Написать хранимую процедуру для нахождения максимального числа одинаковых записей.
Есть таблица заказы, в которой существует запись какой клиент сколько сделал заказов, т.е. есть таблица:
cod_zakaza    |     cod_clienta    | data_zakaza
1                                 1                     12.01.10
2                                 2                     13.01.10
3                                 3                     14.01.10
4                                 4                     15.01.10
5                                 4                     16.01.10
6                                 5                     17.01.10
 В этой таблице каждый клиент имеет свой номер
Нужно написать хранимую процедуру, которая работает со столбиком cod_clienta и ищет там какой клиент сделал больше всего заказов и выдает его номер.
Код написан в программе Interbase.
Код

set term ^;
create procedure testmax
returns(s numeric(15,2))
as
declare variable m varchar(5);
begin
s=0;
for select count (*) from zakaz where cod_clienta
into :m
do
begin
if (m>s) s=m;
end
end^
set term;^

PM MAIL   Вверх
Gluttton
Дата 10.1.2010, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Цитата(DestinyStar @  9.1.2010,  19:34 Найти цитируемый пост)
Написать хранимую процедуру для нахождения максимального числа одинаковых записей.

Запись в терминах БД - это набор полей (он же кортеж). Если cod_zakaza - первичный ключ таблицы, то одинаковых записей в таблице быть не может smile ... Это всё полемика, но рекомендую помедитировать над этим smile ...
Цитата(DestinyStar @  9.1.2010,  19:34 Найти цитируемый пост)
Код написан в программе Interbase.

Код процедуры выполенин в императивной парадигме.
А SQL - декларативный!
Максимум в SQL ищут не перебором в цикле, а путем непосредственного указания (требования) серверу - max(колонка)!

Цитата(DestinyStar @  9.1.2010,  19:34 Найти цитируемый пост)
Помогите пожалуйста исправить хранимую процедуры, написать с помощью запросов нельзя, так как задание другое.

В данном случае необходимо написать именно запрос, а раз уж задание выполнено должно быть в виде хранимой процедуры, то затем полученный запрос "обернуть" телом процедуры smile ...

К сожалению нет сейчас установленного SQL-сервера (хотя с InterBase я вообще не работал), но идея в следующем:
Выполняем запрос с подсчетом количества заказов с группировкой по клиентам:
Код

select
    cod_clienta,
    count(data_zakaza) as zakazy
from table
    group by cod_clienta

Где table - имя таблицы из которой производиться выборка.

В результате должны получить следующее:
Цитата

1                     1
2                     1
3                     1
4                     2
5                     1


Затем "заворачиваем" это запрос (в качестве подзапроса) в запрос, который будет выводить код клиента у которого количество заказов равно максимальному:
Код

select
    sa.cod_clienta
from
(
    select
        cod_clienta,
        count(data_zakaza) as zakazy
    from table
        group by cod_clienta
)   as sa
    where sa.zakazy=
    (
        select
            max(sb.zakazy) as maxzakazy
        from
        (
            select
                cod_clienta,
                count(data_zakaza) as zakazy
            from table
                group by cod_clienta
        )   as sb
    )

В результате должны получить:
Цитата

4


Данный запрос должен пойти на любом сервере.
Его можно упростить наприме применив оконные функции или же применив "бабушкин метод".

Если, что не пойдет - пиши, думаю разберёмся smile ...


--------------------
Слава Україні!
PM MAIL   Вверх
Deniz
Дата 11.1.2010, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 22
Всего: 44



DestinyStar, неплохо бы указать версию InterBase

Gluttton, ты опять все усложняешь  smile 
Код
select cod_clienta, count(data_zakaza) as zakazy
from zakaz
group by cod_clienta
order by 2 desc
в первой записи будет то, что нужно.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.