Monthly PL

Monthly PL Build

29 steps · October 7, 2026
Make it your own →
No one's real data is in this template. It contains the recipe — steps, column names and SQL logic (plus sample data for demos). When you run it, your data is processed in your own browser; your files are never uploaded.

What data it expects

TB_2024-09.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2024-10.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2024-11.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2024-12.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-01.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-02.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-03.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-04.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-05.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-06.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-07.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-08.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-09.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-10.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-11.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2025-12.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2026-01.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2026-02.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2026-03.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2026-04.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2026-05.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2026-06.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2026-07.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
TB_2026-08.csv
period_end · Date32<DAY>fiscal_year · Int64account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8debit · Float64credit · Float64net · Float64
chart_of_accounts.csv
account_id · Int64account_name · Utf8account_type · Utf8account_subtype · Utf8normal_balance · Utf8

Connect QuickBooks Online or drop a CSV / Excel export with a similar layout — the AI adapts the workflow if your columns differ.

How it works — every step, readable

  1. 01TB_2024-09
    SELECT * FROM read_csv_auto('TB_2024-09.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  2. 02TB_2024-10
    SELECT * FROM read_csv_auto('TB_2024-10.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  3. 03TB_2024-11
    SELECT * FROM read_csv_auto('TB_2024-11.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  4. 04TB_2024-12
    SELECT * FROM read_csv_auto('TB_2024-12.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  5. 05TB_2025-01
    SELECT * FROM read_csv_auto('TB_2025-01.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  6. 06TB_2025-02
    SELECT * FROM read_csv_auto('TB_2025-02.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  7. 07TB_2025-03
    SELECT * FROM read_csv_auto('TB_2025-03.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  8. 08TB_2025-04
    SELECT * FROM read_csv_auto('TB_2025-04.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  9. 09TB_2025-05
    SELECT * FROM read_csv_auto('TB_2025-05.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  10. 10TB_2025-06
    SELECT * FROM read_csv_auto('TB_2025-06.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  11. 11TB_2025-07
    SELECT * FROM read_csv_auto('TB_2025-07.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  12. 12TB_2025-08
    SELECT * FROM read_csv_auto('TB_2025-08.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  13. 13TB_2025-09
    SELECT * FROM read_csv_auto('TB_2025-09.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  14. 14TB_2025-10
    SELECT * FROM read_csv_auto('TB_2025-10.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  15. 15TB_2025-11
    SELECT * FROM read_csv_auto('TB_2025-11.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  16. 16TB_2025-12
    SELECT * FROM read_csv_auto('TB_2025-12.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  17. 17TB_2026-01
    SELECT * FROM read_csv_auto('TB_2026-01.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  18. 18TB_2026-02
    SELECT * FROM read_csv_auto('TB_2026-02.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  19. 19TB_2026-03
    SELECT * FROM read_csv_auto('TB_2026-03.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  20. 20TB_2026-04
    SELECT * FROM read_csv_auto('TB_2026-04.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  21. 21TB_2026-05
    SELECT * FROM read_csv_auto('TB_2026-05.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  22. 22TB_2026-06
    SELECT * FROM read_csv_auto('TB_2026-06.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  23. 23TB_2026-07
    SELECT * FROM read_csv_auto('TB_2026-07.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  24. 24TB_2026-08
    SELECT * FROM read_csv_auto('TB_2026-08.csv', auto_type_candidates=['BOOLEAN','BIGINT','DOUBLE','DATE','TIMESTAMP','VARCHAR'])
  25. 25Union TBs Sep 2024–Apr 2025
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_1
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_2
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_3
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_4
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_5
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_6
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_7
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_8
  26. 26Union TBs May 2025–Dec 2025
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_1
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_2
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_3
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_4
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_5
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_6
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_7
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_8
  27. 27Union TBs Jan 2026–Aug 2026
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_1
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_2
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_3
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_4
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_5
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_6
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_7
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_8
  28. 28Union All Monthly Trial Balances
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_1
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_2
    UNION ALL
    SELECT period_end, fiscal_year, account_id, account_name, account_type, account_subtype, normal_balance, debit, credit, net FROM input_3
  29. 29Monthly P&L Sep 2024–Aug 2026
    WITH cleaned AS (
      SELECT
        CAST(period_end AS DATE) AS period_end,
        CAST(account_id AS BIGINT) AS account_id,
        account_name,
        account_type,
        account_subtype,
        COALESCE(CAST(debit AS DOUBLE), 0) AS debit,
        COALESCE(CAST(credit AS DOUBLE), 0) AS credit
      FROM input_1
    ),
    classified AS (
      SELECT
        period_end,
        account_id,
        account_name,
        CASE
          WHEN account_id = 4000 OR lower(account_name) LIKE '%product%revenue%' THEN 'Product revenue'
          WHEN account_id = 4100 OR lower(account_name) LIKE '%service%revenue%' THEN 'Service revenue'
          WHEN account_id BETWEEN 4200 AND 4299 OR lower(account_name) LIKE '%return%' OR lower(account_name) LIKE '%allowance%' THEN 'Returns and allowances'
          WHEN account_id BETWEEN 5000 AND 5200 THEN 'COGS'
          WHEN account_id BETWEEN 6000 AND 6900 THEN account_name
          WHEN account_id IN (7000, 7100) THEN 'Depreciation and amortization'
          WHEN account_id BETWEEN 8000 AND 8099 OR lower(account_name) LIKE '%interest expense%' OR lower(account_name) LIKE '%interest income%' THEN 'Interest expense net of interest income'
          WHEN account_id BETWEEN 9000 AND 9099 OR lower(account_name) LIKE '%tax%' THEN 'Income tax'
          ELSE 'Exclude'
        END AS line_item,
        CASE
          WHEN account_id BETWEEN 4000 AND 4299 THEN credit - debit
          WHEN lower(account_name) LIKE '%interest income%' THEN credit - debit
          ELSE debit - credit
        END AS amount
      FROM cleaned
      WHERE account_id BETWEEN 4000 AND 9999
    ),
    line_activity AS (
      SELECT
        period_end,
        line_item,
        ROUND(SUM(amount), 0) AS amount
      FROM classified
      WHERE line_item <> 'Exclude'
      GROUP BY period_end, line_item
    ),
    base_lines AS (
      SELECT
        CASE
          WHEN line_item = 'Product revenue' THEN 10
          WHEN line_item = 'Service revenue' THEN 20
          WHEN line_item = 'Returns and allowances' THEN 30
          WHEN line_item = 'COGS' THEN 50
          WHEN line_item = 'Depreciation and amortization' THEN 90
          WHEN line_item = 'Interest expense net of interest income' THEN 120
          WHEN line_item = 'Income tax' THEN 140
          ELSE 70
        END AS sort_order,
        line_item,
        period_end,
        amount
      FROM line_activity
    ),
    metrics AS (
      SELECT
        period_end,
        SUM(CASE WHEN line_item IN ('Product revenue','Service revenue','Returns and allowances') THEN amount ELSE 0 END) AS total_revenue,
        SUM(CASE WHEN line_item = 'COGS' THEN amount ELSE 0 END) AS cogs,
        SUM(CASE WHEN line_item NOT IN ('Product revenue','Service revenue','Returns and allowances','COGS','Depreciation and amortization','Interest expense net of interest income','Income tax') THEN amount ELSE 0 END) AS sga,
        SUM(CASE WHEN line_item = 'Depreciation and amortization' THEN amount ELSE 0 END) AS da,
        SUM(CASE WHEN line_item = 'Interest expense net of interest income' THEN amount ELSE 0 END) AS interest_net,
        SUM(CASE WHEN line_item = 'Income tax' THEN amount ELSE 0 END) AS tax
      FROM line_activity
      GROUP BY period_end
    ),
    statement_long AS (
      SELECT sort_order, line_item, period_end, amount, 'amount' AS value_type FROM base_lines
      UNION ALL SELECT 40, 'Total revenue', period_end, total_revenue, 'amount' FROM metrics
      UNION ALL SELECT 60, 'Gross profit', period_end, total_revenue - cogs, 'amount' FROM metrics
      UNION ALL SELECT 65, 'Gross margin %', period_end, CASE WHEN total_revenue = 0 THEN NULL ELSE (total_revenue - cogs) / total_revenue * 100 END, 'percent' FROM metrics
      UNION ALL SELECT 80, 'Total SG&A', period_end, sga, 'amount' FROM metrics
      UNION ALL SELECT 85, 'EBITDA', period_end, total_revenue - cogs - sga, 'amount' FROM metrics
      UNION ALL SELECT 100, 'EBIT', period_end, total_revenue - cogs - sga - da, 'amount' FROM metrics
      UNION ALL SELECT 130, 'Pre-tax income', period_end, total_revenue - cogs - sga - da - interest_net, 'amount' FROM metrics
      UNION ALL SELECT 150, 'Net income', period_end, total_revenue - cogs - sga - da - interest_net - tax, 'amount' FROM metrics
    ),
    final_pivot AS (
      SELECT
        sort_order,
        line_item AS "P&L Line",
        value_type,
        SUM(CASE WHEN period_end = DATE '2024-09-30' THEN amount END) AS "Sep-2024",
        SUM(CASE WHEN period_end = DATE '2024-10-31' THEN amount END) AS "Oct-2024",
        SUM(CASE WHEN period_end = DATE '2024-11-30' THEN amount END) AS "Nov-2024",
        SUM(CASE WHEN period_end = DATE '2024-12-31' THEN amount END) AS "Dec-2024",
        SUM(CASE WHEN period_end = DATE '2025-01-31' THEN amount END) AS "Jan-2025",
        SUM(CASE WHEN period_end = DATE '2025-02-28' THEN amount END) AS "Feb-2025",
        SUM(CASE WHEN period_end = DATE '2025-03-31' THEN amount END) AS "Mar-2025",
        SUM(CASE WHEN period_end = DATE '2025-04-30' THEN amount END) AS "Apr-2025",
        SUM(CASE WHEN period_end = DATE '2025-05-31' THEN amount END) AS "May-2025",
        SUM(CASE WHEN period_end = DATE '2025-06-30' THEN amount END) AS "Jun-2025",
        SUM(CASE WHEN period_end = DATE '2025-07-31' THEN amount END) AS "Jul-2025",
        SUM(CASE WHEN period_end = DATE '2025-08-31' THEN amount END) AS "Aug-2025",
        SUM(CASE WHEN period_end = DATE '2025-09-30' THEN amount END) AS "Sep-2025",
        SUM(CASE WHEN period_end = DATE '2025-10-31' THEN amount END) AS "Oct-2025",
        SUM(CASE WHEN period_end = DATE '2025-11-30' THEN amount END) AS "Nov-2025",
        SUM(CASE WHEN period_end = DATE '2025-12-31' THEN amount END) AS "Dec-2025",
        SUM(CASE WHEN period_end = DATE '2026-01-31' THEN amount END) AS "Jan-2026",
        SUM(CASE WHEN period_end = DATE '2026-02-28' THEN amount END) AS "Feb-2026",
        SUM(CASE WHEN period_end = DATE '2026-03-31' THEN amount END) AS "Mar-2026",
        SUM(CASE WHEN period_end = DATE '2026-04-30' THEN amount END) AS "Apr-2026",
        SUM(CASE WHEN period_end = DATE '2026-05-31' THEN amount END) AS "May-2026",
        SUM(CASE WHEN period_end = DATE '2026-06-30' THEN amount END) AS "Jun-2026",
        SUM(CASE WHEN period_end = DATE '2026-07-31' THEN amount END) AS "Jul-2026",
        SUM(CASE WHEN period_end = DATE '2026-08-31' THEN amount END) AS "Aug-2026",
        CASE
          WHEN value_type = 'percent' THEN NULL
          ELSE SUM(CASE WHEN period_end BETWEEN DATE '2025-01-01' AND DATE '2025-12-31' THEN amount ELSE 0 END)
        END AS placeholder_fy2025,
        CASE
          WHEN value_type = 'percent' THEN NULL
          ELSE SUM(CASE WHEN period_end BETWEEN DATE '2026-01-01' AND DATE '2026-08-31' THEN amount ELSE 0 END)
        END AS placeholder_ytd2026,
        CASE
          WHEN value_type = 'percent' THEN NULL
          ELSE SUM(CASE WHEN period_end BETWEEN DATE '2025-09-01' AND DATE '2026-08-31' THEN amount ELSE 0 END)
        END AS placeholder_ltm
      FROM statement_long
      GROUP BY sort_order, line_item, value_type
    ),
    rollup_margin AS (
      SELECT
        MAX(CASE WHEN "P&L Line" = 'Gross profit' THEN placeholder_fy2025 END) / NULLIF(MAX(CASE WHEN "P&L Line" = 'Total revenue' THEN placeholder_fy2025 END), 0) * 100 AS fy2025_gm,
        MAX(CASE WHEN "P&L Line" = 'Gross profit' THEN placeholder_ytd2026 END) / NULLIF(MAX(CASE WHEN "P&L Line" = 'Total revenue' THEN placeholder_ytd2026 END), 0) * 100 AS ytd2026_gm,
        MAX(CASE WHEN "P&L Line" = 'Gross profit' THEN placeholder_ltm END) / NULLIF(MAX(CASE WHEN "P&L Line" = 'Total revenue' THEN placeholder_ltm END), 0) * 100 AS ltm_gm
      FROM final_pivot
    )
    SELECT
      p."P&L Line",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Sep-2024", 1) ELSE ROUND(p."Sep-2024", 0) END AS "Sep-2024",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Oct-2024", 1) ELSE ROUND(p."Oct-2024", 0) END AS "Oct-2024",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Nov-2024", 1) ELSE ROUND(p."Nov-2024", 0) END AS "Nov-2024",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Dec-2024", 1) ELSE ROUND(p."Dec-2024", 0) END AS "Dec-2024",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Jan-2025", 1) ELSE ROUND(p."Jan-2025", 0) END AS "Jan-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Feb-2025", 1) ELSE ROUND(p."Feb-2025", 0) END AS "Feb-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Mar-2025", 1) ELSE ROUND(p."Mar-2025", 0) END AS "Mar-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Apr-2025", 1) ELSE ROUND(p."Apr-2025", 0) END AS "Apr-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."May-2025", 1) ELSE ROUND(p."May-2025", 0) END AS "May-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Jun-2025", 1) ELSE ROUND(p."Jun-2025", 0) END AS "Jun-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Jul-2025", 1) ELSE ROUND(p."Jul-2025", 0) END AS "Jul-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Aug-2025", 1) ELSE ROUND(p."Aug-2025", 0) END AS "Aug-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Sep-2025", 1) ELSE ROUND(p."Sep-2025", 0) END AS "Sep-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Oct-2025", 1) ELSE ROUND(p."Oct-2025", 0) END AS "Oct-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Nov-2025", 1) ELSE ROUND(p."Nov-2025", 0) END AS "Nov-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Dec-2025", 1) ELSE ROUND(p."Dec-2025", 0) END AS "Dec-2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Jan-2026", 1) ELSE ROUND(p."Jan-2026", 0) END AS "Jan-2026",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Feb-2026", 1) ELSE ROUND(p."Feb-2026", 0) END AS "Feb-2026",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Mar-2026", 1) ELSE ROUND(p."Mar-2026", 0) END AS "Mar-2026",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Apr-2026", 1) ELSE ROUND(p."Apr-2026", 0) END AS "Apr-2026",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."May-2026", 1) ELSE ROUND(p."May-2026", 0) END AS "May-2026",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Jun-2026", 1) ELSE ROUND(p."Jun-2026", 0) END AS "Jun-2026",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Jul-2026", 1) ELSE ROUND(p."Jul-2026", 0) END AS "Jul-2026",
      CASE WHEN p.value_type = 'percent' THEN ROUND(p."Aug-2026", 1) ELSE ROUND(p."Aug-2026", 0) END AS "Aug-2026",
      CASE WHEN p.value_type = 'percent' THEN ROUND(r.fy2025_gm, 1) ELSE ROUND(p.placeholder_fy2025, 0) END AS "FY2025",
      CASE WHEN p.value_type = 'percent' THEN ROUND(r.ytd2026_gm, 1) ELSE ROUND(p.placeholder_ytd2026, 0) END AS "YTD Aug-2026",
      CASE WHEN p.value_type = 'percent' THEN ROUND(r.ltm_gm, 1) ELSE ROUND(p.placeholder_ltm, 0) END AS "LTM Aug-2026"
    FROM final_pivot p
    CROSS JOIN rollup_margin r
    WHERE COALESCE(
      p."Sep-2024",
      p."Oct-2024",
      p."Nov-2024",
      p."Dec-2024",
      p."Jan-2025",
      p."Feb-2025",
      p."Mar-2025",
      p."Apr-2025",
      p."May-2025",
      p."Jun-2025",
      p."Jul-2025",
      p."Aug-2025",
      p."Sep-2025",
      p."Oct-2025",
      p."Nov-2025",
      p."Dec-2025",
      p."Jan-2026",
      p."Feb-2026",
      p."Mar-2026",
      p."Apr-2026",
      p."May-2026",
      p."Jun-2026",
      p."Jul-2026",
      p."Aug-2026",
      p.placeholder_fy2025,
      p.placeholder_ytd2026,
      p.placeholder_ltm
    ) IS NOT NULL
    ORDER BY p.sort_order, p."P&L Line"

Run this on your books

Free to try — no sign-up, no card. The workflow runs in your browser; your data never leaves your machine.

Make it your own →