在 SQlite 中生成每月汇总值

Generate Monthly Aggregated Values in SQlite

我是 SQLite 的新手,我从事 SQL 查询已有一段时间了。

假设我们有数据库 table 说 tbl_expense 具有以下 table 结构。

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
)

假设我们在 table.

中存储了以下数据

预期输出

假设我们有 expense_date 作为时间戳,我如何编写一个 SQL 查询以产生如下所示的输出。

请帮我解决这个问题。

您需要 LEFT 连接 return 对 table 和条件聚合的所有月份缩写的 cte:

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;

条件:

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

用于 return 仅当年的结果。
您可以更改它以获得您想要的任何年份的结果,例如:

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

参见demo