{"slug":"dividend-income-tracker-with-sql","qid":"income_by_month","label":"Projected dividend income by month, next twelve months","post_title":"Build a Dividend Income Tracker With SQL","post_url":"/blog/dividend-income-tracker-with-sql#q-income_by_month","columns":["month","month_name","projected_income","payment_count"],"rows":[{"month":"2026-10","month_name":"Oct 2026","projected_income":40.72,"payment_count":1},{"month":"2026-11","month_name":"Nov 2026","projected_income":106.04,"payment_count":2},{"month":"2026-12","month_name":"Dec 2026","projected_income":335.32,"payment_count":5},{"month":"2027-01","month_name":"Jan 2027","projected_income":40.72,"payment_count":1},{"month":"2027-02","month_name":"Feb 2027","projected_income":106.04,"payment_count":2},{"month":"2027-03","month_name":"Mar 2027","projected_income":229.32,"payment_count":4},{"month":"2027-04","month_name":"Apr 2027","projected_income":146.72,"payment_count":2},{"month":"2027-05","month_name":"May 2027","projected_income":106.04,"payment_count":2},{"month":"2027-06","month_name":"Jun 2027","projected_income":229.32,"payment_count":4},{"month":"2027-07","month_name":"Jul 2027","projected_income":146.72,"payment_count":2},{"month":"2027-08","month_name":"Aug 2027","projected_income":106.04,"payment_count":2},{"month":"2027-09","month_name":"Sep 2027","projected_income":229.32,"payment_count":4},{"month":"2027-10","month_name":"Oct 2027","projected_income":106,"payment_count":1}],"shape":"series","sql":"WITH holdings AS\n(\n    SELECT\n        tupleElement(h, 1) AS ticker,\n        tupleElement(h, 2) AS shares\n    FROM\n    (\n        SELECT arrayJoin([\n            ('KO',   200.0),\n            ('PG',    60.0),\n            ('JNJ',   50.0),\n            ('MSFT',  40.0),\n            ('XOM',   80.0),\n            ('O',    150.0)\n        ]) AS h\n    )\n),\ndeclared AS\n(\n    SELECT\n        ticker,\n        argMax(cash_amount, ex_dividend_date) AS cash_per_payment\n    FROM global_markets.stocks_dividends\n    WHERE ticker IN ('KO', 'PG', 'JNJ', 'MSFT', 'XOM', 'O')\n      AND currency = 'USD'\n      AND frequency IN (1, 2, 4, 12)\n      AND ex_dividend_date >= today() - 400\n      AND ex_dividend_date <= today() + 120\n    GROUP BY ticker\n),\npaid AS\n(\n    SELECT\n        ticker,\n        pay_date\n    FROM global_markets.stocks_dividends\n    WHERE ticker IN ('KO', 'PG', 'JNJ', 'MSFT', 'XOM', 'O')\n      AND frequency IN (1, 2, 4, 12)\n      AND pay_date >= today() - 365\n      AND pay_date <  today()\n    GROUP BY ticker, pay_date\n)\nSELECT\n    formatDateTime(toStartOfMonth(addYears(p.pay_date, 1)), '%Y-%m') AS month,\n    formatDateTime(toStartOfMonth(addYears(p.pay_date, 1)), '%b %Y') AS month_name,\n    round(sum(toFloat64(d.cash_per_payment) * h.shares), 2)          AS projected_income,\n    count()                                                          AS payment_count\nFROM paid AS p\nINNER JOIN holdings AS h ON h.ticker = p.ticker\nINNER JOIN declared AS d ON d.ticker = p.ticker\nGROUP BY month, month_name\nORDER BY month","computed_at":"2026-10-08T16:11:57.871222+00:00","elapsed":0.402164744}