Skip to content
Advertisement

Generate Monthly Aggregated Values in SQlite

I am new in SQLite and i have been working on SQL Query for quite some time.

Lets say we have database table say tbl_expense with the following table structure.

tbl_expense

CREATE TABLE IF NOT EXISTS tbl_expense(
    expense_id INTEGER PRIMARY KEY AUTOINCREMENT, 
    expense_name VARCHAR(20) DEFAULT NULL, 
    expense_desc VARCHAR(500) DEFAULT NULL, 
    expense_type VARCHAR(20) DEFAULT NULL, 
    expense_amt DECIMAL(6.3) DEFAULT NULL, 
    expense_date TIMESTAMP DEFAULT NULL
)

Assume we have the following data stored in the table.

enter image description here

Expected Output

Assuming we have expense_date as timestamp, How can i write a SQL query in such a way that i can produce the output like the one below.

enter image description here

Please help me on this issue.

Advertisement

Answer

You need a LEFT join of a cte that returns all the month abbreviations to the table and conditional aggregation:

WITH cte(month, month_name) AS (VALUES
  ('01', 'JAN'), ('02', 'FEB'), ('03', 'MAR'), ('04', 'APR'), ('05', 'MAY'), ('06', 'JUN'), 
  ('07', 'JUL'), ('08', 'AUG'), ('09', 'SEP'), ('10', 'OCT'), ('11', 'NOV'), ('12', 'DEC')
)
SELECT c.month_name,
       TOTAL(CASE WHEN expense_type = 'Income' THEN expense_amt END) Income,
       TOTAL(CASE WHEN expense_type = 'expense' THEN expense_amt END) Expense
FROM cte c LEFT JOIN tbl_expense e
ON strftime('%m', e.expense_date, 'unixepoch') = c.month
AND strftime('%Y', e.expense_date, 'unixepoch') = strftime('%Y', CURRENT_DATE)
GROUP BY c.month_name
ORDER BY c.month;

The condition:

strftime('%Y', e.expense_date, 'unixepoch') = strftime('%Y', CURRENT_DATE)

is used to return results only for the current year.
You can change it to get results for any year that you want, like:

strftime('%Y', e.expense_date, 'unixepoch') = '2020'

See the demo.

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement