Как получить максимальную дату в месяц, используя SQL
Что-то пошло не так, и я понимаю, что не получаю то, что хочу. У меня есть следующие строки в таблице:
0000527746 1000 10.06.2017 20170718100757.5010080
0000527746 1000 10.06.2017 20170718100757.5039300
0000527746 1000 11.06.2017 20170718100839.9209480
0000527746 1000 11.06.2017 20170718100906.3337170
0000527746 1000 24.07.2017 20170718095843.3555610
0000527746 1000 24.07.2017 20170718100209.2203570
0000527746 1000 24.07.2017 20170718100757.4970390
и я хочу выбрать последнюю дату каждого месяца, а именно я хочу, чтобы выбор принес мне следующие строки
0000527746 1000 11.06.2017 20170718100906.3337170
0000527746 1000 24.07.2017 20170718100757.4970390
Я использую следующий sql
select bukrs kunnr dat max( time ) as time
from zcollectoraction into corresponding fields of table it_collectoraction
where bukrs = p_bukrs and
kunnr in so_kunnr and
dat in so_date
group by bukrs kunnr dat.
но он отображает следующие строки
0000527746 1000 11.06.2017 20170718100906.3337170
0000527746 1000 11.06.2017 20170718100906.3337170
0000527746 1000 24.07.2017 20170718100757.4970390
Что делать, чтобы иметь 1 линию в месяц?
3 ответа
Я думаю, что есть два решения по этому вопросу. 1) Вы можете добавить поле yearmonth к вашей таблице базы данных. И добавьте это поле в группу по заявке.
0000527746 1000 10.06.2017 20170718100757.5010080 201706
0000527746 1000 10.06.2017 20170718100757.5039300 201706
0000527746 1000 11.06.2017 20170718100839.9209480 201706
0000527746 1000 11.06.2017 20170718100906.3337170 201706
0000527746 1000 24.07.2017 20170718095843.3555610 201707
0000527746 1000 24.07.2017 20170718100209.2203570 201707
0000527746 1000 24.07.2017 20170718100757.4970390 201707
select bukrs kunnr dat max( time ) as time
from zcollectoraction into corresponding fields of table
it_collectoraction
where bukrs = p_bukrs and
kunnr in so_kunnr and
dat in so_date
group by bukrs kunnr dat yearmonth.
2) Вы можете выбрать все данные и расположить их в цикле. Или вы можете использовать ваш старый запрос выбора не имеет значения вообще.
select bukrs kunnr dat time
from zcollectoraction into corresponding fields of table
it_collectoraction
where bukrs = p_bukrs and
kunnr in so_kunnr and
dat in so_date .
loop at it_collectoraction into data(ls_coll).
delete it_collectoraction[] WHERE dat(6) = ls_coll-dat(6)
and dat < = ls_coll-dat
and time < ls_coll-time.
endloop.
Что вам нужно, это group by
не dat
, но по месяцам и годам - этот пункт будет работать:
GROUP BY bukrs, kunnr, MONTH(dat), YEAR(dat)
Здравствуйте и спасибо за ваши ответы. Я решил проблему, выполнив 2 выбора. В 1-й день я получаю последний день или дни месяца со следующим выбором
select bukrs kunnr yearmonth max( dat ) as dat
from zcollectoraction into corresponding fields of table it_collectoraction
where bukrs = p_bukrs and
kunnr in so_kunnr and
dat in so_date
group by bukrs kunnr yearmonth.
а затем я сделал цикл во внутренней таблице, чтобы заполнить оставшиеся данные и выбрать максимальное время для всех записей, особенно когда на букрс, куннр и дату приходится более 1 строки.
select single * from zcollectoraction
into corresponding fields of wa_collectoraction
where bukrs = wa_collectoraction-bukrs and
kunnr = wa_collectoraction-kunnr and
dat = wa_collectoraction-dat and
time = ( select max( time ) as time
from zcollectoraction
where bukrs = wa_collectoraction-bukrs and
kunnr = wa_collectoraction-kunnr and
dat = wa_collectoraction-dat ).
Еще раз спасибо Элиас