{"slug":"dividend-income-tracker-with-sql","qid":"income_by_year","label":"What the sample list paid per calendar year, share counts held fixed","post_title":"Build a Dividend Income Tracker With SQL","post_url":"/blog/dividend-income-tracker-with-sql#q-income_by_year","columns":["year","portfolio_income","payment_count"],"rows":[{"year":2021,"portfolio_income":1545.66,"payment_count":32},{"year":2022,"portfolio_income":1621.73,"payment_count":32},{"year":2023,"portfolio_income":1690.77,"payment_count":32},{"year":2024,"portfolio_income":1731.79,"payment_count":31},{"year":2025,"portfolio_income":1854.16,"payment_count":32}],"shape":"ranking","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)\nSELECT\n    toYear(p.pay_date)                                 AS year,\n    round(sum(toFloat64(p.cash_amount) * h.shares), 2) AS portfolio_income,\n    count()                                            AS payment_count\nFROM\n(\n    SELECT\n        ticker,\n        pay_date,\n        max(cash_amount) AS cash_amount\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 >= toDate('2021-01-01')\n      AND pay_date <  toDate('2026-01-01')\n    GROUP BY ticker, pay_date\n) AS p\nINNER JOIN holdings AS h ON h.ticker = p.ticker\nGROUP BY year\nORDER BY year","computed_at":"2026-10-08T16:11:58.740471+00:00","elapsed":0.391162878}