While I just found this, I use two axis tables and every other instance will jitter the values.

data menstrual;
input Age mean low high Users Cycles;
label mean = "Luteal length";
datalines;
18 12.1 11.3 12.8 46 123
19 12.07 11.75 12.3 354 1082
20 12.2 11.97 12.33 811 2547
21 12.18 12.0 12.25 1535 4925
22 12.27 12.15 12.4 2425 8786
23 12.25 12.2 12.3 3527 13579
24 12.28 12.22 12.39 4693 19749
25 12.3 12.24 12.39 5966 27000
26 12.33 12.3 12.42 7718 35845
;
run;

data menstrual;
set menstrual;
if int(age/2) ne age/2 then do;
users2=users;
cycles2=cycles;
users=.;
cycles=.;
end;
run;
options missing=' ';
ods graphics / width=270px height=480px; /* make sure there isn't much room between age groups */

/* first attempt: Use XAXISTABLE to position text that shows Users and Cycles for each age */
title "Show Table of Counts";
title2 "XAXISTABLE Statement";
proc sgplot data=menstrual noautolegend;
scatter x=Age y=mean / yerrorlower=low yerrorupper=high errorbarattrs=GraphData1;
xaxistable Users / x=Age location=inside; /* can use POSITION=TOP */
xaxistable Users2 / x=Age location=inside nolabel; /* can use POSITION=TOP */
xaxistable Cycles / x=Age location=inside; /* can use POSITION=TOP */
xaxistable Cycles2 / x=Age location=inside nolabel; /* can use POSITION=TOP */
xaxis grid min=18 offsetmin=0.1 offsetmax=0.1;
yaxis grid;
run;