Делаю так
select extract(month from v.ddate_from),
extract(year from v.ddate_from),
extract(month from v.ddate_to),
extract(year from v.ddate_to)
into dmonth1, dyear1, dmonth2, dyear2
from T1 v
where v.NPRN = r.nrn;
И далее
select sum(vpd.nsumm)
into dbo
from T2 vpd
where vpd.nprn = user_num
and vpd.nyear between dyear1 and dyear2
and vpd.nmonth between dmonth1 and dmonth2;
Но ничего не выводит. Почему?
Здравствуйте, Funny Rabbit, Вы писали:
T2
------------
230311 2015 7 -612,
52
230311 2015 6 -323,
00
230311 2015 5 -154,
11
230311 2015 4 -35,
93
230311 2015 3 -55,
93
230311 2015 2 -505,
93
230311 2015 1 -455,93
230311 2014 12 -553,76
230311 2014 11 -342,65
230311 2014 10 -292,
65
230311 2014 9 61,
90
230311 2014 8 0,00
T1
01.08.2014 31.07.2015
Здравствуйте, Funny Rabbit, Вы писали:
FR>Делаю так
FR>FR>select extract(month from v.ddate_from),
FR> extract(year from v.ddate_from),
FR> extract(month from v.ddate_to),
FR> extract(year from v.ddate_to)
FR> into dmonth1, dyear1, dmonth2, dyear2
FR> from T1 v
FR> where v.NPRN = r.nrn;
FR>
1. Что такое r?
2. Куда и что оно должно выводить? Вы же в переменные всё сложили.
FR>FR>select sum(vpd.nsumm)
FR> into dbo
FR> from T2 vpd
FR> where vpd.nprn = user_num
FR> and vpd.nyear between dyear1 and dyear2
FR> and vpd.nmonth between dmonth1 and dmonth2;
FR>
FR>Но ничего не выводит. Почему?
3. Опять — что и куда оно должно выводить?
Для начала, посмотрите, что подхватывается селектом:
select extract(month from v.ddate_from),
extract(year from v.ddate_from),
extract(month from v.ddate_to),
extract(year from v.ddate_to)
-- into dmonth1, dyear1, dmonth2, dyear2
from T1 v
where v.NPRN = r.nrn;
Убедившись, что select делает то, что нужно, проверьте, что присваивание работает:
select extract(month from v.ddate_from),
extract(year from v.ddate_from),
extract(month from v.ddate_to),
extract(year from v.ddate_to)
into dmonth1, dyear1, dmonth2, dyear2
from T1 v
where v.NPRN = r.nrn;
dbms_output.put_line('dmonth1: ' || dmonth1 || ' dyear1:' || dyear1 || ' dmonth2:' || dmonth2 || ' dyear2: ' || dyear2);
Потом точно так же второй стейтмент — для начала посмотрите, что найдёт select.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Funny Rabbit, Вы писали:
FR>>Делаю так
FR>>FR>>select extract(month from v.ddate_from),
FR>> extract(year from v.ddate_from),
FR>> extract(month from v.ddate_to),
FR>> extract(year from v.ddate_to)
FR>> into dmonth1, dyear1, dmonth2, dyear2
FR>> from T1 v
FR>> where v.NPRN = r.nrn;
FR>>
S>1. Что такое r?
S>2. Куда и что оно должно выводить? Вы же в переменные всё сложили.
r — Это курсор. Для упрощения пусть будет user_num (230311)
FR>>FR>>select sum(vpd.nsumm)
FR>> into dbo
FR>> from T2 vpd
FR>> where vpd.nprn = user_num
FR>> and vpd.nyear between dyear1 and dyear2
FR>> and vpd.nmonth between dmonth1 and dmonth2;
FR>>
FR>>Но ничего не выводит. Почему?
S>3. Опять — что и куда оно должно выводить?
S>Для начала, посмотрите, что подхватывается селектом:
Все правильно выводит первый запрос. Дело в другом.
select * from dual where 3 between 4 and 2
Ничего не выводит
а
select * from dual where 3 between 2 and 4
выводит. В этом проблема
Здравствуйте, Funny Rabbit, Вы писали:
FR>Но ничего не выводит. Почему?
Потому что нельзя так с датами работать.
PS Ну, в совсем уж крайнем случае хотя-бы так:
select sum(vpd.nsumm)
into dbo
from T2 vpd
where vpd.nprn = user_num
and (vpd.nyear * 12 + vpd.nmonth) between (dyear1 * 12 + dmonth1) and (dyear2 * 12 + dmonth2)
Здравствуйте, Funny Rabbit, Вы писали:
FR> Все правильно выводит первый запрос. Дело в другом.
FR> FR> select * from dual where 3 between 4 and 2
FR>
FR> Ничего не выводит
FR> а
FR> FR> select * from dual where 3 between 2 and 4
FR>
FR> выводит. В этом проблема
Очень странно..
Этот оракл такой противоречивый...
S>>Для начала, посмотрите, что подхватывается селектом:
FR>Все правильно выводит первый запрос. Дело в другом.
FR>FR>select * from dual where 3 between 4 and 2
FR>
FR>Ничего не выводит
FR>а
FR>FR>select * from dual where 3 between 2 and 4
FR>
FR>выводит. В этом проблема
X between a and b это, на самом деле, (X >= a and X <= b).
Ты хочешь, чтобы выражение 3 >= 4 and 3 <= 2 вернуло True ?
Здравствуйте, Funny Rabbit, Вы писали:
FR>FR>select sum(vpd.nsumm)
FR> into dbo
FR> from T2 vpd
FR> where vpd.nprn = user_num
FR> and vpd.nyear between dyear1 and dyear2
FR> and vpd.nmonth between dmonth1 and dmonth2;
FR>
FR>Но ничего не выводит. Почему?
Потому что INTO написал