Ah, so the nulls aren't in the database, it's a display issue (FYI, the formatting tags described in the FAQ may be easier to use).
Select Customer.CustomerID, Item.ItemDesc, SUM(Customer.ItemQty) as ItemQty
From Customer, ItemQty
Where Item.ItemID=Customer.ItemNo
Group By Customer.CustomerID, Item.ItemDesc
Which can be massively simplified if you can guarantee the customer table will only have one record per CustomerID/ItemNo pair. At least this query ensures that there is not more than one. It also retrieves the ItemDesc rather than the ItemID.
A list of ItemDescs from the Item table gives you (most) of the column headings, so all you need are default values (specifically empty strings) for the display values.
$defaults = array_fill_keys($itemdescs ,'');
And then for each $record from the above query
if(empty($rows[$record['CustomerId']]))
$rows[$record['CustomerID']] = $defaults;
$rows[$record['CustomerId']][$record['ItemDesc']] = $record['ItemQty];
Display:
echo '<tr><th>Customer</th>';
foreach($itemdescs as $desc) echo '<th>'.$desc.'</th>';
echo '</tr>';
and
foreach($record as $customer=>$items)
{
echo '<tr><td>', $customer, '</td>';
foreach($items as $qty)
echo '<td>', $qty, '</td>';
echo '</tr>';
}