Страница 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" приписать.

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

Добавлено: 28 апр 2008, 17:25
astinus
Круто. Всем спасибо.
Добавлено: 28 апр 2008, 19:15
Ivan_Pisarevsky
WildSery писал(а):Ivan_Pisarevsky писал(а):А... догадался, я забыл "avg" приписать.

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

Ок, уговорил, просто среднее ищу настолько редко, что не обратил внимание, если склероз мне не изменяет то в продакшн у меня их нет совсем, как-то все больше сумму ищу, и эльзы по привычке обнулил, привык писать эльзы некомфортно мне полагаться на умолчания.

Ну друг-друга-то мы поняли, вродь автор топика фишку просек, там уж разберется. Судя по вводным ему и процедура скорее всего не потребуется.
Уж больно он извернулся, как Петька в известном анекдоте укусил себя за...
