Generalize the code to work with Summerize/Summary.
dt = current data table();
Summarize( g = By(:Column 0, :Column 1 ) );
For( i = 1, i <= N Items( g[1] ), i++,
r = dt << Get Rows Where( dt:Column 0 == g[1][i] & dt:Column 1 == g[2][i]);
dt:Column 3[r] = Concat Items( dt:Column 2[r], "_" );
);
nt = dt << Summary( Group( :Column 0, :Column 1, :Column 3 ) );
very useful 
Up to now, I used Split to sort the entries, combine them and merge them back to the main table:
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
<BR />//--------
dt << new column ("rank", Formula( Col Rank( :name, :age ) ));
// put names next to each other, grouped by age
DTsplit=dt<< Split(
Split By( :rank),
Split( :name ),
Group( :age )
);
// Combine columns to a linge column
DTsplit << Combine Columns(
columns(
:"1"n, :"2"n, :"3"n, :"4"n, :"5"n, :"6"n, :"7"n, :"8"n, :"9"n, :"10"n,
:"11"n, :"12"n
),
Column Name( "allNames" ),
Delimiter( "," )
);<BR /><BR />//-----
// Update data tables
dt<< Update(
With( DTsplit ),
Match Columns( :age = :age ),
Add Columns from Update Table( :allNames ),
Replace Columns in Main Table( None )
);to get:

If Summarize had an option to concatenate strings, the whole part between the //---- could be replaced by a simple Summarize.