Страница 1 из 1

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

Добавлено: 25 апр 2008, 17:55
astinus
Доброго дня!

Помогите спроектировать запросик под 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
Можно ли это обыграть красиво?

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

Добавлено: 25 апр 2008, 21:41
kdv
а for select do execute statement - вообще капец.

Добавлено: 26 апр 2008, 18:37
Tonal

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

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

Добавлено: 28 апр 2008, 12:15
astinus
Tonal писал(а):

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

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

Добавлено: 28 апр 2008, 13:33
Ivan_Pisarevsky
Что должно стать ясно из текста запроса я, например, не понял.

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

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

Не айс?

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

Добавлено: 28 апр 2008, 14:06
Ivan_Pisarevsky
В таком случае еще раз помедитируй над идеей моего поста выше.

Добавлено: 28 апр 2008, 14:51
WildSery
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

Добавлено: 28 апр 2008, 15:11
Ivan_Pisarevsky
И чем твой айс айсее моего айса?

Добавлено: 28 апр 2008, 15:12
Ivan_Pisarevsky
А... догадался, я забыл "avg" приписать. :)

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

Добавлено: 28 апр 2008, 17:25
astinus
Круто. Всем спасибо.

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