{"slug":"portfolio-analysis-from-the-free-sql-api","qid":"dividend_income","label":"Trailing twelve-month dividend income by holding","post_title":"Portfolio Analysis in SQL: Weights to Drawdown","post_url":"/blog/portfolio-analysis-from-the-free-sql-api#q-dividend_income","columns":["ticker","payment_count","ttm_dividend_per_share","ttm_income","income_yield_pct","blend_ttm_income"],"rows":[{"ticker":"KO","payment_count":4,"ttm_dividend_per_share":2.1,"ttm_income":630,"income_yield_pct":2.43,"blend_ttm_income":2055.8},{"ticker":"XOM","payment_count":4,"ttm_dividend_per_share":4.12,"ttm_income":618,"income_yield_pct":2.48,"blend_ttm_income":2055.8},{"ticker":"JNJ","payment_count":4,"ttm_dividend_per_share":5.28,"ttm_income":475.2,"income_yield_pct":2.06,"blend_ttm_income":2055.8},{"ticker":"MSFT","payment_count":4,"ttm_dividend_per_share":3.64,"ttm_income":163.8,"income_yield_pct":0.69,"blend_ttm_income":2055.8},{"ticker":"AAPL","payment_count":4,"ttm_dividend_per_share":1.06,"ttm_income":127.2,"income_yield_pct":0.32,"blend_ttm_income":2055.8},{"ticker":"NVDA","payment_count":4,"ttm_dividend_per_share":0.52,"ttm_income":41.6,"income_yield_pct":0.22,"blend_ttm_income":2055.8}],"shape":"table","sql":"WITH holdings AS\n(\n    SELECT 'AAPL' AS ticker, 120 AS shares\n    UNION ALL SELECT 'MSFT', 45\n    UNION ALL SELECT 'NVDA', 80\n    UNION ALL SELECT 'KO',   300\n    UNION ALL SELECT 'JNJ',  90\n    UNION ALL SELECT 'XOM',  150\n),\nmarks AS\n(\n    SELECT\n        ticker,\n        argMax(toFloat64(close), (date, _ingest_time)) AS last_close\n    FROM global_markets.stocks_daily_aggs\n    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'KO', 'JNJ', 'XOM')\n      AND date >= today() - 30\n    GROUP BY ticker\n),\ndivs AS\n(\n    SELECT\n        ticker,\n        ex_dividend_date,\n        max(toFloat64(cash_amount)) AS cash_amount\n    FROM global_markets.stocks_dividends\n    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'KO', 'JNJ', 'XOM')\n      AND currency = 'USD'\n      AND ex_dividend_date >= today() - 365\n      AND ex_dividend_date <  today()\n    GROUP BY ticker, ex_dividend_date\n),\nttm AS\n(\n    SELECT\n        ticker,\n        count()          AS payment_count,\n        sum(cash_amount) AS dps\n    FROM divs\n    GROUP BY ticker\n),\nincome AS\n(\n    SELECT\n        h.ticker                             AS ticker,\n        t.payment_count                      AS payment_count,\n        round(t.dps, 4)                      AS ttm_dividend_per_share,\n        round(h.shares * t.dps, 2)           AS ttm_income,\n        round(100 * t.dps / m.last_close, 2) AS income_yield_pct\n    FROM holdings AS h\n    INNER JOIN ttm   AS t ON t.ticker = h.ticker\n    INNER JOIN marks AS m ON m.ticker = h.ticker\n)\nSELECT\n    ticker,\n    payment_count,\n    ttm_dividend_per_share,\n    ttm_income,\n    income_yield_pct,\n    round(sum(ttm_income) OVER (), 2) AS blend_ttm_income\nFROM income\nORDER BY ttm_income DESC","computed_at":"2026-10-07T15:11:30.857820+00:00","elapsed":0.171956711}