Спроектировать запросик

Модераторы: kdv, CyberMax

Ответить
astinus
Сообщения: 9
Зарегистрирован: 24 апр 2006, 14:10

Спроектировать запросик

Сообщение astinus » 25 апр 2008, 17:55

Доброго дня!

Помогите спроектировать запросик под FB 2.1. Хотел сделать следующее (см. нмже), но парсер не пропускает. Идея, я думаю, ясна из запроса:

Код: Выделить всё

CREATE PROCEDURE T_ANALIZ_PR
returns (
    avg_pr_month_1 numeric(15,2),
    avg_pr_month_2 numeric(15,2),
    avg_pr_month_3 numeric(15,2),
    avg_pr_month_4 numeric(15,2)
as
declare variable counter smallint;
declare variable avg_price numeric(15,2);
begin
FOR
     select extract (month from some_date), avg(price)
        from .......
        where some_date between '1.1.2008' and '30.4.2008'
        and .......
        and .......
        and .......
       group by 1
        into :counter, :avg_price
        DO
        EXECUTE STATEMENT
        'avg_price_' || counter || ' = ' || avg_price || ';';
suspend;
END
Можно ли это обыграть красиво?

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 25 апр 2008, 20:51

1, используй тег [code][/code]
2, не понятно
3, лучше дал бы какие есть данные и чего хочется
4, EXECUTE STATEMENT тут не к селу не к городу
5, 'avg_price_' || counter || ' = ' || avg_price || ';'; вообще мрак

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 25 апр 2008, 21:41

а for select do execute statement - вообще капец.

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Сообщение Tonal » 26 апр 2008, 18:37

Код: Выделить всё

    if (counter = 1) then avg_pr_month_1 = avg_price;
    else if (counter = 2) then avg_pr_month_2 = avg_price;
    ...

astinus
Сообщения: 9
Зарегистрирован: 24 апр 2006, 14:10

Сообщение astinus » 28 апр 2008, 12:15

Tonal писал(а):

Код: Выделить всё

    if (counter = 1) then avg_pr_month_1 = avg_price;
    else if (counter = 2) then avg_pr_month_2 = avg_price;
    ...
Собственно говоря, результат именно этот и хотелось, но не хотелось плодить 12 строк if'ов.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 28 апр 2008, 13:33

Что должно стать ясно из текста запроса я, например, не понял.

Амбисни по-русски, а?

select
extract (month from some_date),
case extract (month from some_date) when 1 then X else 0 end,
case extract (month from some_date) when 2 then X else 0 end,
...
case extract (month from some_date) when 12 then X else 0 end,
from .......
where some_date between '1.1.2008' and '30.4.2008'
and .......
and .......
and .......
group by 1

Не айс?

astinus
Сообщения: 9
Зарегистрирован: 24 апр 2006, 14:10

Сообщение astinus » 28 апр 2008, 13:45

Хотелось одной строкой кода присвоить значение 12 возвратным переменным:
avg_pr_month_1, avg_pr_month_2, avg_pr_month_3 .. avg_pr_month_12
без того, чтобы плодить 12 строк кода if.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 28 апр 2008, 14:06

В таком случае еще раз помедитируй над идеей моего поста выше.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 28 апр 2008, 14:51

Ivan_Pisarevsky писал(а):Не айс?
Неа, не айс. Вот айс:

Код: Выделить всё

select extract (month from some_date), 
       avg(case when extract(month from some_date) = 1 then price end),
       avg(case when extract(month from some_date) = 2 then price end),
...
       avg(case when extract(month from some_date) = 12 then price end),
  from ....... 
  where some_date between '1.1.2008' and '30.4.2008'  and ...
  group by 1
  into avg_pr_month_1, avg_pr_month_2, ..., avg_pr_month_12

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 28 апр 2008, 15:11

И чем твой айс айсее моего айса?

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 28 апр 2008, 15:12

А... догадался, я забыл "avg" приписать. :)

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 28 апр 2008, 15:53

Ivan_Pisarevsky писал(а):А... догадался, я забыл "avg" приписать. :)
Не только. Ты собъёшь правильное среднее значение нулями. А мои "нуллы" будут проигнорированы :wink:

astinus
Сообщения: 9
Зарегистрирован: 24 апр 2006, 14:10

Сообщение astinus » 28 апр 2008, 17:25

Круто. Всем спасибо.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 28 апр 2008, 19:15

WildSery писал(а):
Ivan_Pisarevsky писал(а):А... догадался, я забыл "avg" приписать. :)
Не только. Ты собъёшь правильное среднее значение нулями. А мои "нуллы" будут проигнорированы :wink:
Ок, уговорил, просто среднее ищу настолько редко, что не обратил внимание, если склероз мне не изменяет то в продакшн у меня их нет совсем, как-то все больше сумму ищу, и эльзы по привычке обнулил, привык писать эльзы некомфортно мне полагаться на умолчания. :) Ну друг-друга-то мы поняли, вродь автор топика фишку просек, там уж разберется. Судя по вводным ему и процедура скорее всего не потребуется.
Уж больно он извернулся, как Петька в известном анекдоте укусил себя за... ;)

Ответить