% This file is embedded in datatool-user.pdf version 3.4.1 2025-04-25
% Example 84 Display Two Fields in One Column
% Label: "ex:displaydbmergefields"
% arara: pdflatex
% arara: pdfcrop
\documentclass[12pt]{article}
\pagestyle{empty}
 \begin{filecontents}[noheader,overwrite]{studentmarks.csv}
Surname,Forename,StudentNo,Assign1,Assign2,Assign3
"Smith, Jr",John,102689,68,57,72
"Brown",Jane,102647,75,84,80
"Brown",Jane,102646,64,92,79
"Brown",Andy,103569,42,52,54
"Adams",Zoë,105987,52,48,57
"Brady",Roger,106872,68,60,62
"Verdon",Clare,104356,45,50,48
\end{filecontents}

\usepackage{datatool}
\DTLsetup{store-datum,default-name=marks}
\DTLread{studentmarks.csv}
\ExplSyntaxOn
\RenewDocumentCommand \DTLdisplaydbAddItem 
 { m m m m m m m m } 
{
 \int_compare:nNnTF
  { #7 } = { \c_one_int }
 {
  \DTLaction[ return={\l_tmpa_tl=Forename} ]
  { current ~ row ~ values }
  \datatool_if_null_or_empty:NTF \l_tmpa_tl
  {
  \tl_put_right:Nn #1 { #3 { #2 } }
   }
  {
   \tl_put_right:Nx #1 
    { \exp_not:N #3 { \exp_not:n { #2 }, ~ \exp_not:V \l_tmpa_tl } }
  }
  }
 {
  \tl_put_right:Nn #1 { #3 { #2 } }
 }
}
\ExplSyntaxOff 
\begin{document}
\DTLaction[
 options={
  only-keys={Surname,StudentNo,Assign1,Assign2,Assign3},
  header-row={Name & Reg.\ No., & Mark 1 & Mark 2 & Mark 3}
  }
 ]{display} 
\end{document}
