Как мы можем использовать сумму и максимум одновременно, когда группируем по данным?
Как мы можем суммировать сумму и получить максимальную дату одновременно, когда сгруппированы по идентификатору в JCL
Входные данные:
Id Amount Date
--------------------
123 200 20180516
123 300 20180520
456 100 20180616
456 700 20180420
Ожидаемый результат:
Id Amount Date
--------------------
123 500 20180520
456 800 20180616
Что я уже пробовал:
SORTST5 EXEC PGM=SORT
SYSOUT DD SYSOUT=*
SYSPRINT DD SYSOUT=*
SORTIN DD DSN=&VNTMPççWRK.INWORK,DISP=SHR
SORTOUT DD DSN=&VNTMP..WRK.OUTWORK.OUT.FRM,
DISP=(,CATLG,DELETE),
RECFM=FB,LRECL=84, SPACE=(CYL,(100,100), RLSE)
SYSIN DD *
SORT FIELDS=(1,3,PD,A)
SUM FIELDS=(4,3,PD)
1 ответ
Решение
JCL не является исполняемым файлом, и вы не можете манипулировать датой в JCL без таких утилит, как SORT.
Я использовал ICETOOL (утилиту) в JCL для достижения ожидаемого результата. Первый оператор Control отсортирует входные данные с использованием идентификатора (в порядке возрастания) и даты (в порядке убывания). Второй оператор управления будет делать SUM FIELDS на выходе, полученном с использованием первого оператора управления.
//STEP1 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFMSG DD SYSOUT=*
//TOOLIN DD *
SORT FROM(INDD) TO(OUTDD1) USING(CTL1)
SORT FROM(OUTDD1) TO(OUTDD2) USING(CTL2)
//INDD DD *
123 200 20180516
123 300 20180520
456 700 20180420
456 100 20180616
//OUTDD1 DD DSN=XXX.ICETOOL.OUTDD1,
// DISP=(,CATLG,DELETE),
// SPACE=(CYL,(100,0),RLSE),
// DCB=(LRECL=80,RECFM=FB,BLKSIZE=0)
//OUTDD2 DD DSN=XXX.ICETOOL.OUTDD2,
// DISP=(,CATLG,DELETE),
// SPACE=(CYL,(100,0),RLSE),
// DCB=(LRECL=80,RECFM=FB,BLKSIZE=0)
//SSMSG DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//CTL1CNTL DD *
SORT FIELDS=(1,3,ZD,A,9,8,ZD,D)
/*
//CTL2CNTL DD *
SORT FIELDS=(1,3,ZD,A)
SUM FIELDS=NONE
/*