Tally accountant to data analyst: start from your day book
In this article (7 sections)
Related programme: the Data Analytics with Generative AI course (3–4 months; ₹90,000 (inclusive of GST) · EMI from ₹4,000/month).
If you work in Tally, you already maintain a relational dataset: every voucher has a date, a type, a party ledger and an amount, and bill-wise details link receipts to the invoices they settle. The move to data analyst starts by rebuilding one report you produce every month, such as debtor ageing, in SQL from exported vouchers, then explaining what the numbers mean for collections.
The query you should be able to write first
Here is the whole project in miniature. The data is synthetic, but the shape mirrors a bill-wise export from a sales register and a receipts register. Run it in any SQLite tool, or in Python with the built-in sqlite3 module.
CREATE TABLE bills (bill_no TEXT PRIMARY KEY, party TEXT, bill_date TEXT, amount REAL);
CREATE TABLE receipts (receipt_no TEXT, bill_no TEXT, receipt_date TEXT, amount REAL);
INSERT INTO bills VALUES
('S-101','Gupta Traders','2026-06-10',48000),
('S-102','Mehra Agencies','2026-07-02',25000),
('S-103','Gupta Traders','2026-08-05',30000),
('S-104','Kaur Hardware','2026-08-20',18000),
('S-105','Mehra Agencies','2026-09-12',42000),
('S-106','Kaur Hardware','2026-06-25',15000);
INSERT INTO receipts VALUES
('R-01','S-101','2026-07-15',20000),
('R-02','S-102','2026-07-30',25000),
('R-03','S-104','2026-09-01',10000),
('R-04','S-106','2026-07-20',5000);
WITH open_bills AS (
SELECT b.bill_no, b.party, b.bill_date,
b.amount - COALESCE(SUM(r.amount), 0) AS pending,
CAST(julianday('2026-09-30') - julianday(b.bill_date) AS INTEGER) AS age_days
FROM bills b
LEFT JOIN receipts r ON r.bill_no = b.bill_no
GROUP BY b.bill_no
)
SELECT party,
SUM(CASE WHEN age_days <= 30 THEN pending ELSE 0 END) AS d0_30,
SUM(CASE WHEN age_days BETWEEN 31 AND 60 THEN pending ELSE 0 END) AS d31_60,
SUM(CASE WHEN age_days BETWEEN 61 AND 90 THEN pending ELSE 0 END) AS d61_90,
SUM(CASE WHEN age_days > 90 THEN pending ELSE 0 END) AS d90_plus,
SUM(pending) AS total_pending
FROM open_bills
WHERE pending > 0
GROUP BY party
ORDER BY d90_plus DESC, total_pending DESC;On this synthetic data, Gupta Traders owes ₹28,000 in the 90+ bucket (the unpaid part of S-101) and ₹30,000 in 31–60, Kaur Hardware has ₹10,000 in 90+ and ₹8,000 in 31–60, and Mehra Agencies has ₹42,000 that is only 18 days old. S-102 disappears because it was fully settled.
Why this query is really an accounting question
Everything in that query maps to something you already do by hand.
| In Tally | In the query |
|---|---|
| Bill-wise details, "Agst Ref" on a receipt | receipts.bill_no joining to bills.bill_no |
| Outstanding amount per bill | b.amount - COALESCE(SUM(r.amount), 0) |
| Ageing analysis as on a date | julianday('2026-09-30') - julianday(b.bill_date) |
| Ageing slabs you choose in the report | the CASE WHEN buckets |
| Hiding settled bills | WHERE pending > 0 |
The LEFT JOIN matters. An inner join would drop S-103 and S-105, which have no receipts at all, and those are exactly the bills a collections team needs to see. COALESCE turns "no receipt" into zero so the subtraction works. If you can explain those two choices in accounting language, you understand the query better than someone who copied it.
Turn the ageing into a decision, not just a table
An accountant's ageing report stops at the numbers. An analyst's version ends with a recommendation. Extend the project in three small steps:
- 1Add a credit-days column. Real parties have different agreed terms. Add a
partiestable withcredit_daysand compute days past due rather than days since invoice. A 45-day-old bill is fine on 60-day terms and overdue on 30-day terms. - 2Rank who to call first. Sort by amount past due multiplied by how late it is, and write two sentences on why the top three parties deserve a call this week.
- 3Show one reconciliation check. Prove that total pending in your query equals the closing sundry debtors balance for the same synthetic data. Analysts who can tie a report back to the books are rarer than analysts who can draw charts.
Put the SQL, a small CSV of the synthetic vouchers, and a one-page note in a public repository. Say clearly in the README that the data is invented.
The gap a Tally background usually leaves
Tally shields you from the data model. The ledgers, groups and vouchers are real tables underneath, but you rarely see joins, keys or duplicates directly. The skills to close, roughly in order:
- SQL beyond single tables: joins,
GROUP BY, window functions for running balances. - Cleaning exported data: inconsistent party names ("Gupta Traders" vs "Gupta Traders Pvt Ltd"), dates stored as text, narration fields holding information that should be a column.
- One BI tool, usually Power BI, so your ageing becomes a filterable page instead of a PDF.
- Writing for non-accountants. A sales head does not care about sundry debtors; they care which customers to chase.
You do not need to learn machine learning first. For this background it is a detour.
Finance MIS or accounts analyst before data analyst
Look for postings titled finance data analyst, MIS analyst (finance) or business analyst, finance operations. They sit closest to the data you already understand, so an interviewer can test your SQL on problems where your domain knowledge is an advantage. A generic "data analyst" role at a consumer app is possible later, but it asks you to learn a new domain and new tools at the same time.
Telling an interviewer why you left the books
Interviewers will ask why you are leaving accounts. Avoid "I want to grow" on its own. Tie the answer to the report you rebuilt.
"For four years I prepared monthly debtor ageing in Tally for a distribution business. The report was accurate, but every month the sales team asked the same follow-up questions, like which customers are late relative to their credit terms, and I had to answer them by exporting to Excel and rebuilding things by hand. I started learning SQL to answer those questions directly. My portfolio project rebuilds bill-wise ageing from voucher data, adds credit terms, and ties the total back to the debtor balance. I want a role where that kind of question is the main job, not the extra work after closing."
Notice what the answer does: it names a real artefact, a real limitation, the skill you learned to fix it, and a check that shows accounting discipline.
Next step
A CV that says "Tally ERP, GST filing, bank reconciliation" reads as accounts work; add the ageing project and check what the free skill check picks up. If you want structured practice on SQL, Power BI and verifying AI-assisted analysis on finance-style data, the Data Analyst programme covers that path; a counsellor can walk you through the current batch details. If you are unsure whether analytics or data science suits you better, read data analytics vs data science.
Frequently asked questions
Can a Tally accountant become a data analyst without a computer science degree?
Yes, the analyst work you are aiming for is mostly SQL, spreadsheets, a BI tool and clear writing, none of which needs a CS degree. What you do need is evidence that you can query and explain data outside Tally, which is why a portfolio project built on familiar accounting data is the fastest proof.
Should I mention Tally on a data analyst resume?
Mention it as the source system you understand, not as your headline skill. Write the line around what you did with the data, for example reconciling bill-wise receivables or preparing monthly ageing for follow-up, then show the same work rebuilt in SQL.
Pankit Kumar has 10 years in Data Science & AI, building and shipping production systems in regulated pharma and clinical environments. He is a freelance trainer at Boston Institute of Analytics, AnalytixLabs and Scaler, and has taught this material to thousands of working professionals.
This article is part of our Data Analytics with Generative AI programme — 3–4 months. The full analyst stack — Excel, SQL, Power BI and Python pipelines — then a generative-AI layer you can prove is right.
Explore Data Analytics with Generative AI