{"slug":"dividend-income-tracker-with-sql","qid":"position_income","label":"Annual dividend income per position, with a running portfolio total","post_title":"Build a Dividend Income Tracker With SQL","post_url":"/blog/dividend-income-tracker-with-sql#q-position_income","columns":["ticker","annual_income","running_total"],"rows":[{"ticker":"O","annual_income":488.7,"running_total":488.7},{"ticker":"KO","annual_income":424,"running_total":912.7},{"ticker":"XOM","annual_income":329.6,"running_total":1242.3},{"ticker":"JNJ","annual_income":268,"running_total":1510.3},{"ticker":"PG","annual_income":261.24,"running_total":1771.54},{"ticker":"MSFT","annual_income":156.8,"running_total":1928.34}],"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),\ndeclared AS\n(\n    SELECT\n        ticker,\n        argMax(cash_amount, ex_dividend_date) AS cash_per_payment,\n        argMax(frequency, ex_dividend_date)   AS pays_per_year\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)\nSELECT\n    ticker,\n    annual_income,\n    round(sum(annual_income) OVER (ORDER BY annual_income DESC\n        ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 2) AS running_total\nFROM\n(\n    SELECT\n        h.ticker AS ticker,\n        round(toFloat64(d.cash_per_payment) * d.pays_per_year * h.shares, 2) AS annual_income\n    FROM holdings AS h\n    INNER JOIN declared AS d ON d.ticker = h.ticker\n)\nORDER BY annual_income DESC","computed_at":"2026-10-08T16:11:58.027473+00:00","elapsed":0.062580964}