One row per answer, keyed on the ID that never moves
Every export carries the question ID alongside the wording used that year, so a three-year series can be assembled without anyone guessing which column was which.
| company_id | cycle_year | question_id | question_text | value |
|---|---|---|---|---|
| halden-roe | 2024 | GOV.BOARD.COMMITTEE | Which body holds formal oversight of the Climate Transition Plan? | Executive committee |
| halden-roe | 2024 | GOV.BOARD.FREQ | How often does that body review transition plan progress? | Never |
| halden-roe | 2024 | GOV.CTP.APPROVED | Has the board formally approved the current Climate Transition Plan? | No |
| halden-roe | 2024 | GOV.CTP.REVIEW.FREQ | On what cycle is the plan itself re-approved? | No fixed cycle |
| halden-roe | 2024 | GOV.EXEC.INCENTIVE | What share of executive variable remuneration is linked to climate performance? | 37 |
| halden-roe | 2024 | GOV.ACCOUNTABLE.EXEC | Which executive role carries day-to-day accountability for delivery? | Head of function below exec level |
| halden-roe | 2024 | GOV.FTE | How many full-time equivalents work on climate transition delivery? | 4 |
| halden-roe | 2024 | GOV.CARBON.PRICE | Do you apply an internal carbon price to investment decisions? | No |
| halden-roe | 2024 | GOV.RISK.INTEGRATION | How is climate risk integrated into enterprise risk management? | Assessed informally |
| halden-roe | 2024 | GOV.SKILLS | How is climate competency held at board level? | None of the above |
| halden-roe | 2024 | TGT.SBTI.STATUS | What is your current status with the Science Based Targets initiative? | Not engaged |
| halden-roe | 2024 | TGT.BASE.YEAR | What is the base year for your emissions targets? | 2019 |
Showing 12 of 8,629 rows in this selection. Long format is the shape that survives a questionnaire rewrite: adding a question adds rows, never columns, so last year's file still parses. The Excel button writes a real workbook, not a renamed CSV.
Bringing the three SurveyMonkey years across
Existing exports arrive keyed on question text and column position. The migration assigns each historical column a persistent ID once, and from then on nothing has to be re-mapped.
| Source column | Year | Assigned ID | What happened to it since |
|---|---|---|---|
| Q7. Which body holds formal oversight of the Climate Transition Plan? | 2024 | GOV.BOARD.COMMITTEE | merged into GOV.BOARD.OVERSIGHT in 2026 |
| Q8. How often does that body review transition plan progress? | 2024 | GOV.BOARD.FREQ | merged into GOV.BOARD.OVERSIGHT in 2026 |
| Q31. Do you have a commitment to eliminate coal from Tier 2 wet processing? | 2025 | ENR.COAL.PHASEOUT | same ID, answer format changed in 2026 |
| Q44. What share of your materials portfolio is classed as preferred? | 2025 | MAT.PREFERRED.PCT | same ID, reworded in 2026 |
| Q52. How is Tier 2 energy and emissions data collected? | 2024 | SUP.T2.DISCLOSURE | same ID, one option retired in 2026 |
| Q39. Describe the thermal energy profile of your wet-processing base… | 2025 | ENR.THERMAL | split into two questions in 2026 |
Two of the six rows above are questions that no longer exist in the 2026 form. They are still imported, still stored, and still appear in every export — a retired question is invisible to respondents but never deleted, because the moment you delete it the three-year series breaks.
What a downstream query looks like
select c.name, r.cycle_year, r.value from responses r join companies c on c.id = r.company_id where r.question_id = 'ENR.COAL.PHASEOUT' order by c.name, r.cycle_year;
That query is stable forever. It keeps working through the 2026 rewording and the 2026 change from yes/no to a year, because neither of those touched the ID.