HCRIS Hospital Financials
Description
Full financial and operational detail from the Healthcare Cost Report Information System (HCRIS) — the annual cost report every Medicare-certified hospital in the US is required to file. One row per (CCN × fiscal year); a hospital with 20 years of filing history has 20 rows. This is the underlying cost-report line-item table (charges, costs, revenues, bed counts, workforce, balance sheet), not a search-index summary — it's the full financial history CMS/NBER-cleaned files provide, preferred here over a "latest per CCN" view because bulk-license buyers generally want the time series, not just the current snapshot.
- Source: CMS Healthcare Cost Report Information System, via CMS/NBER cleaned cost-report files.
- Refresh cadence: rolling, as CMS posts new/amended cost reports; ingestion cadence is not fixed-calendar.
- Row count: 173,959
- Vintage: 2026-05-26 (max
ingested_atobserved at export time) - Coverage: fiscal years 1996–2025, 10,138 distinct CCNs; 846 of them map to a publicly traded operator across 14 tickers (2026-08-29 crosswalk).
Table: hcris_hospital_financials
Snowflake: HEALTHPARSE_DATA.HCRIS_HOSPITAL_FINANCIALS.HCRIS_HOSPITAL_FINANCIALS
| Column | Type | Description | Notes |
|---|---|---|---|
ccn |
VARCHAR | CMS Certification Number — the 6-character federal ID for the hospital (facility-level primary identifier across virtually every CMS dataset). | Not unique alone; unique with fy_end. |
npi |
VARCHAR | Linked organizational National Provider Identifier, when a match to the hospital's NPI record was made. | Populated on 49,696 of 173,959 rows (~29%). Absent doesn't mean the hospital lacks an NPI — it means the ingestion-time link wasn't made. |
provider_name |
VARCHAR | Hospital name as filed on the cost report. | 7,244 rows (~4%) hold the literal placeholder Unknown where the source file didn't carry a resolvable name. |
street / city / state / zip |
VARCHAR | Mailing address on file with the cost report. | city/state are null wherever provider_name is Unknown. |
fy_begin / fy_end |
DATE | Cost-report fiscal year start/end dates (hospital fiscal years are not calendar-aligned). | fy_end is never null; fy_begin can be. |
fy_end_year / fy_end_month |
SMALLINT | Denormalized year/month of fy_end, for filtering without a date function. |
— |
control_type |
VARCHAR | Ownership/control category from the cost report (e.g. "Voluntary non-profit - Church", "Proprietary", "Government - State"). | Mixed encoding: ~96% of rows (166,185) store the raw CMS numeric control-type code (1–13) rather than the text label — no crosswalk table ships with this export. ~1.4% (2,496) are null. Only ~3% carry the human-readable text shown in the description above. |
hospital_type |
VARCHAR | Facility type (e.g. "Acute Care Hospitals", "Critical Access Hospitals", "Psychiatric", "Long-term", "Childrens", "Rural Emergency Hospital"). | Mostly missing/coded: ~55% of rows (95,044) are null, ~27% (46,206) hold a raw numeric code instead of text, leaving only ~19% with a resolved text label. |
total_beds / available_beds |
INTEGER | Licensed / staffed-and-available bed counts as filed. | — |
total_inpatient_days / medicare_inpatient_days / medicaid_inpatient_days |
BIGINT | Total patient-days for the fiscal year, and the Medicare/Medicaid-attributed subsets. | — |
total_outpatient_visits / total_discharges |
BIGINT | Outpatient visit count and total inpatient discharges for the fiscal year. | — |
total_charges / total_costs / total_revenues |
DOUBLE | Hospital-wide gross charges, total costs, and total revenues for the fiscal year, in dollars. | Charges ≠ what payers actually pay — see HPT Negotiated Rates for actual negotiated/cash prices. |
medicare_charges / medicare_costs / medicaid_charges / medicaid_costs |
DOUBLE | Charges and costs attributable specifically to Medicare and Medicaid patients. | — |
bad_debt |
DOUBLE | Bad debt expense recognized for the fiscal year. | — |
charity_care_charges / uncompensated_care |
DOUBLE | Charges written off as charity care, and total uncompensated care (charity care + bad debt, per CMS worksheet S-10 methodology). | — |
net_income |
DOUBLE | Total revenues minus total costs for the fiscal year. | Used to compute operating margin (net_income / total_revenues) in the source app; not pre-computed in this export. |
total_assets / total_liabilities / fund_balance |
DOUBLE | Fiscal-year-end balance sheet: total assets, total liabilities, and fund balance (assets − liabilities). | — |
total_salaries / total_fte |
DOUBLE | Total salary expense and total full-time-equivalent staff count for the fiscal year. | — |
resident_count_inpatient / resident_count_outpatient |
DOUBLE | Medical resident FTE counts by inpatient/outpatient rotation, for teaching hospitals. | Null for the large majority of non-teaching hospitals. |
ownership_change_flag |
BOOLEAN | Whether CMS recorded an ownership/control change (CHOW) affecting this cost-report period. | Defaults false; only a small minority are true. |
ingested_at |
TIMESTAMP WITH TIME ZONE | When this row was last (re-)ingested into the source database. | Distinct from _vintage (a fixed constant) and _exported_at (this Parquet snapshot's export time) — see the README. |
Example queries (Snowflake)
-- 1. Financial-distress screen: hospitals with negative net income and
-- high uncompensated care, most recent fiscal year on file per CCN.
SELECT "ccn", "provider_name", "state", "fy_end_year", "total_revenues", "net_income",
"uncompensated_care"
FROM HEALTHPARSE_DATA.HCRIS_HOSPITAL_FINANCIALS.HCRIS_HOSPITAL_FINANCIALS
WHERE "net_income" < 0
QUALIFY ROW_NUMBER() OVER (PARTITION BY "ccn" ORDER BY "fy_end" DESC) = 1
ORDER BY "uncompensated_care" DESC
LIMIT 100;
-- 2. Operating margin trend for a single hospital across all filed years.
SELECT "ccn", "provider_name", "fy_end_year",
"total_revenues", "net_income",
CASE WHEN "total_revenues" > 0 THEN "net_income" / "total_revenues" END AS operating_margin
FROM HEALTHPARSE_DATA.HCRIS_HOSPITAL_FINANCIALS.HCRIS_HOSPITAL_FINANCIALS
WHERE "ccn" = '340001'
ORDER BY "fy_end_year";
-- 3. State-level rollup: total beds and aggregate net income by state,
-- latest fiscal year available per CCN.
SELECT "state", count(DISTINCT "ccn") AS hospitals, sum("total_beds") AS total_beds,
sum("net_income") AS aggregate_net_income
FROM (
SELECT *
FROM HEALTHPARSE_DATA.HCRIS_HOSPITAL_FINANCIALS.HCRIS_HOSPITAL_FINANCIALS
QUALIFY ROW_NUMBER() OVER (PARTITION BY "ccn" ORDER BY "fy_end" DESC) = 1
)
GROUP BY "state"
ORDER BY hospitals DESC;