I agree that breaking it up into at least two tables is a good idea. Here's a skeleton for each of them:
clients
clientID int not null auto_increment,
primary key (clientID),
clientName varchar (20)
payments
paymentID int not null auto_increment,
primary key (paymentID),
clientID int not null,
billingDate date, (when the bill went out)
dueDate date,
amountDue,
amountPaid,
paymentDate date
You would want to add more to the "users" table like firstName, lastName, etc. I'm just putting off to get you going, though.
As you can see, each table has a column called "clientID". If the "payments" table, there is a column called "billingDate" which would be when a bill was generated. At your cable company, perhaps bills are generated the third Tuesday of each month, so for this month, the value would be "2004-06-15".
If you wanted to find out if Mr. Jones (who has a clientID of "10") has paid his bill for 2004-06-15, the query would be as follows:
SELECT p.paymentID
FROM payments AS p
WHERE p.clientID = '10'
AND p.billingDate = '2004-06-15';
This is a very simple query. You had indicated you wanted to be able to report all customers with overdue bills for a given month:
SELECT c.clientID
FROM clients AS c
LEFT JOIN payments AS p
ON (p.clientID = c.clientID)
WHERE p.dueDate = '2004-06-15'
AND p.paymentDate = NULL;
You could re-write the above query to not use a LEFT JOIN if speed is a major issue, but you get the idea. In the query that just gave you, I selected "c.clientID" instead of "p.clientID" because I figure you'll be selecting multiple columns, but all from the "clients" table (e.g. firstName, lastName, etc.--things specific to the client and not just the bill istself which the "payments" table captures).