I wanted to elaborate on Samuel's answer to be more details. Let's say you are building a transaction that looks like the following:
cardano-cli transaction build-raw \
--tx-in <TxHash>#<TxIx> \
--tx-out <payment.addr>+<change> \
--tx-out <destinationAddress>+0 \
--invalid-hereafter $(( ${currentSlot} + 10000)) \
--fee 0 \
--out-file tx.tmp
All you have to do is create more --tx-in options. Make sure you calculate the total ada in all --tx-in options to correctly calculate the change output for the single tx-out. Something of the pattern below would work using 3 --tx-in arguments.
cardano-cli transaction build-raw \
--tx-in <TxHash>#<TxIx> \
--tx-in <TxHash>#<TxIx> \
--tx-in <TxHash>#<TxIx> \
--tx-out <payment.addr>+<totalchange> \
--tx-out <destinationAddress>+0 \
--invalid-hereafter $(( ${currentSlot} + 10000)) \
--fee 0 \
--out-file tx.tmp
Lastly, remember that the utxo must balance out to zero so
all the utxos with ada your are using must equal the fee plus how much ada you are sending plus how much change you have in your one combined utxo left over