11 de junho de 2026

Internamentos por Disparo de Arma de Fogo em Portugal (2017–2024)

por Zé Maria Gonçalves Pereira

Entre 2017 e 2024, os hospitais do SNS registaram 1.206 internamentos com diagnóstico de disparo de arma de fogo, uma média de cerca de 150 casos por ano. As agressões e os acidentes são as circunstâncias mais frequentes, mas são as lesões auto-infligidas que apresentam a maior mortalidade intra-hospitalar — 26,5%. Os dados cobrem apenas a era ICD-10 (a partir de 2017), uma vez que na era anterior os hospitais portugueses raramente registavam o mecanismo da lesão.

Internamentos por Disparo de Arma de Fogo em Portugal

Este estudo analisa os episódios de internamento hospitalar no SNS em que foi registado, em qualquer posição de diagnóstico, um código ICD-10 relativo a disparo de arma de fogo — abrangendo acidentes, agressões, lesões auto-infligidas, situações de intenção indeterminada e intervenções legais. A análise cobre o período 2017–2024, correspondente à adoção generalizada do ICD-10 em Portugal.

1.206
Total de internamentos (2017–2024)
Média de ~150 casos por ano
8,4%
Mortalidade intra-hospitalar global
101 óbitos em 1.206 internamentos
13,0 dias
Demora média de internamento
Reflexo da gravidade das lesões por projéctil

Evolução Anual

O número de internamentos registados oscilou entre os 103 (2018) e os 166 (2020), sem tendência clara de subida ou descida sustentada ao longo do período. O ligeiro pico de 2020 pode estar associado a alterações nos padrões de registo durante a pandemia de COVID-19, mais do que a um aumento real de ocorrências.

Internamentos por disparo de arma de fogo, por ano e circunstância (2017–2024)

Exclui 2016 (transição ICD-10, apenas 7 episódios). Intervenção legal: <5 casos/ano, suprimida.

Circunstância do Disparo

As agressões (36,6%) e os acidentes (35,5%) são as duas circunstâncias mais frequentes e apresentam volumes semelhantes. As lesões auto-infligidas correspondem a 16,7% dos casos. Cerca de 10,7% dos episódios ficaram classificados como «intenção indeterminada», o que pode reflectir dificuldade clínica ou administrativa em determinar a circunstância.

Internamentos e mortalidade por circunstância (2017–2024)
CircunstânciaInternamentos%ÓbitosMortalidade (%)
Agressão44836,6%153,5%
Acidente43535,5%194,5%
Auto-infligida20516,7%5426,5%
Intenção indeterminada13110,7%1310,1%
Intervenção legal<5<1%0

Células com n<5 suprimidas. Mortalidade = óbitos intra-hospitalares (dsp=20).

Mortalidade: as Lesões Auto-infligidas em Destaque

A mortalidade intra-hospitalar varia drasticamente consoante a circunstância. As lesões auto-infligidas têm uma taxa de 26,5% — mais de seis vezes superior à das agressões (3,5%). Este diferencial reflecte provavelmente a localização anatómica dos disparos: os suicídios com arma de fogo tendem a envolver a cabeça ou o tórax, regiões com maior letalidade.

Mortalidade intra-hospitalar por circunstância (%)

Intervenção legal excluída (n<5). Mortalidade = óbitos intra-hospitalares.

Perfil dos Doentes: Sexo e Idade

O perfil é marcadamente masculino: os homens representam 90% dos internamentos. A faixa etária mais afectada é a dos 18–34 anos no sexo masculino, seguida pelos 35–54 anos — o que é consistente com a literatura internacional sobre violência por arma de fogo. Nas mulheres, a distribuição é mais dispersa, com alguma concentração nos 35–54 anos.

Internamentos por faixa etária e sexo (2017–2024)

Feminino 75+: n<5, suprimido. Exclui sexo indeterminado.

Hospitais com Mais Internamentos

Os hospitais de maior volume são os grandes centros urbanos de Lisboa e Porto, o que reflecte tanto a dimensão populacional como a concentração de trauma de alta complexidade nestes centros de referência.

Top 15 hospitais por volume de internamentos (2017–2024)
HospitalInternamentos
ULS de Santa Maria, E.P.E.159
ULS de São José, E.P.E.135
ULS de São João, E.P.E.82
ULS de Amadora / Sintra, E.P.E.79
ULS de Coimbra, E.P.E.66
ULS de Santo António, E.P.E.58
ULS de Almada / Seixal, E.P.E.56
ULS de Lisboa Ocidental, E.P.E.55
ULS do Algarve, E.P.E.52
ULS de Trás-os-Montes e Alto Douro, E.P.E.41
ULS de Gaia / Espinho, E.P.E.38
ULS de Viseu Dão-Lafões, E.P.E.34
ULS de Braga, E.P.E.31
ULS do Tâmega e Sousa, E.P.E.29
ULS do Arco Ribeirinho, E.P.E.27

Nomes de hospital reflectem a estrutura organizacional de 2025 (ULS após fusões).

Metodologia

Fonte: Base de Dados de Morbilidade Hospitalar (BDMH), ACSS, 2017–2024.

Universo: Episódios de internamento hospitalar no SNS (tipo_port_apr31 = 'Int'), com icd_versao = '10'.

Identificação de casos: Presença de pelo menos um código ICD-10-CM de causa externa por disparo de arma de fogo em qualquer posição de diagnóstico (d1–d10), através da tabela diagnoses. Prefixos utilizados: W32–W34 (acidente), X72–X74 (auto-infligida/suicídio), X93–X95 (agressão), Y22–Y24 (intenção indeterminada), Y350 (intervenção legal).

Período: 2017–2024. O ano de 2016 foi excluído da análise principal por corresponder apenas à fase de transição para ICD-10 (7 episódios). A era ICD-9 (2000–2016) não é analisada porque os hospitais portugueses raramente registavam os códigos de causa externa (série E) nesse período.

Deduplicação: Cada episódio é identificado pela combinação (n_ficticio_utente, hospital, data_entrada). O mesmo episódio com vários diagnósticos de arma de fogo é contado uma única vez.

Mortalidade: Definida como destino de alta = 20 (falecido).

Demora média: Calculada sobre episódios com dias_int ≥ 0 (excluído o valor sentinela −1).

Supressão de células: Células com n < 5 são apresentadas como «<5».

Limitações: (1) Os dados reflectem apenas internamentos no SNS; casos tratados exclusivamente em urgência ou no sector privado não estão incluídos. (2) A causa externa depende da qualidade do registo clínico-administrativo, podendo haver sub-registo. (3) Os nomes de hospital reflectem a estrutura organizacional de 2025.

Reprodutibilidade: consultas SQL utilizadas (5)

Distribuição por circunstância (acidente, agressão, auto-infligida, etc.)

WITH af AS (SELECT e.ano, e.sexo, e.idade, e.dsp, e.distrito, e.n_ficticio_utente, e.hospital, e.data_entrada, CASE WHEN d.codigo LIKE 'W32%' OR d.codigo LIKE 'W33%' OR d.codigo LIKE 'W34%' THEN 'Acidente' WHEN d.codigo LIKE 'X72%' OR d.codigo LIKE 'X73%' OR d.codigo LIKE 'X74%' THEN 'Auto-infligida' WHEN d.codigo LIKE 'X93%' OR d.codigo LIKE 'X94%' OR d.codigo LIKE 'X95%' THEN 'Agressão' WHEN d.codigo LIKE 'Y22%' OR d.codigo LIKE 'Y23%' OR d.codigo LIKE 'Y24%' THEN 'Intenção indeterminada' WHEN d.codigo LIKE 'Y350%' THEN 'Intervenção legal' ELSE 'Outro' END AS circunstancia FROM episodes e JOIN diagnoses d ON d.ano = e.ano AND d.hospital = e.hospital AND d.data_entrada = e.data_entrada AND d.n_ficticio_utente = e.n_ficticio_utente AND d.icd_versao = e.icd_versao WHERE e.tipo_port_apr31 = 'Int' AND e.icd_versao = '10' AND (d.codigo LIKE 'W32%' OR d.codigo LIKE 'W33%' OR d.codigo LIKE 'W34%' OR d.codigo LIKE 'X72%' OR d.codigo LIKE 'X73%' OR d.codigo LIKE 'X74%' OR d.codigo LIKE 'X93%' OR d.codigo LIKE 'X94%' OR d.codigo LIKE 'X95%' OR d.codigo LIKE 'Y22%' OR d.codigo LIKE 'Y23%' OR d.codigo LIKE 'Y24%' OR d.codigo LIKE 'Y350%')), dedup AS (SELECT DISTINCT ano, sexo, idade, dsp, distrito, n_ficticio_utente, hospital, data_entrada, circunstancia FROM af) SELECT circunstancia, COUNT(*) AS episodios, ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS pct FROM dedup GROUP BY circunstancia ORDER BY episodios DESC

Evolução anual por circunstância

WITH af AS (SELECT e.ano, e.n_ficticio_utente, e.hospital, e.data_entrada, CASE WHEN d.codigo LIKE 'W32%' OR d.codigo LIKE 'W33%' OR d.codigo LIKE 'W34%' THEN 'Acidente' WHEN d.codigo LIKE 'X72%' OR d.codigo LIKE 'X73%' OR d.codigo LIKE 'X74%' THEN 'Auto-infligida' WHEN d.codigo LIKE 'X93%' OR d.codigo LIKE 'X94%' OR d.codigo LIKE 'X95%' THEN 'Agressão' WHEN d.codigo LIKE 'Y22%' OR d.codigo LIKE 'Y23%' OR d.codigo LIKE 'Y24%' THEN 'Intenção indeterminada' WHEN d.codigo LIKE 'Y350%' THEN 'Intervenção legal' ELSE 'Outro' END AS circunstancia FROM episodes e JOIN diagnoses d ON d.ano = e.ano AND d.hospital = e.hospital AND d.data_entrada = e.data_entrada AND d.n_ficticio_utente = e.n_ficticio_utente AND d.icd_versao = e.icd_versao WHERE e.tipo_port_apr31 = 'Int' AND e.icd_versao = '10' AND (d.codigo LIKE 'W32%' OR d.codigo LIKE 'W33%' OR d.codigo LIKE 'W34%' OR d.codigo LIKE 'X72%' OR d.codigo LIKE 'X73%' OR d.codigo LIKE 'X74%' OR d.codigo LIKE 'X93%' OR d.codigo LIKE 'X94%' OR d.codigo LIKE 'X95%' OR d.codigo LIKE 'Y22%' OR d.codigo LIKE 'Y23%' OR d.codigo LIKE 'Y24%' OR d.codigo LIKE 'Y350%')), dedup AS (SELECT DISTINCT ano, n_ficticio_utente, hospital, data_entrada, circunstancia FROM af) SELECT ano, circunstancia, COUNT(*) AS episodios FROM dedup GROUP BY ano, circunstancia ORDER BY ano, circunstancia

Distribuição por sexo e faixa etária

WITH af AS (SELECT e.sexo, e.idade, e.n_ficticio_utente, e.hospital, e.data_entrada FROM episodes e JOIN diagnoses d ON d.ano = e.ano AND d.hospital = e.hospital AND d.data_entrada = e.data_entrada AND d.n_ficticio_utente = e.n_ficticio_utente AND d.icd_versao = e.icd_versao WHERE e.tipo_port_apr31 = 'Int' AND e.icd_versao = '10' AND (d.codigo LIKE 'W32%' OR d.codigo LIKE 'W33%' OR d.codigo LIKE 'W34%' OR d.codigo LIKE 'X72%' OR d.codigo LIKE 'X73%' OR d.codigo LIKE 'X74%' OR d.codigo LIKE 'X93%' OR d.codigo LIKE 'X94%' OR d.codigo LIKE 'X95%' OR d.codigo LIKE 'Y22%' OR d.codigo LIKE 'Y23%' OR d.codigo LIKE 'Y24%' OR d.codigo LIKE 'Y350%')), dedup AS (SELECT DISTINCT sexo, idade, n_ficticio_utente, hospital, data_entrada FROM af) SELECT CASE sexo WHEN 1 THEN 'Masculino' WHEN 2 THEN 'Feminino' ELSE 'Indeterminado' END AS sexo, CASE WHEN idade < 18 THEN '0-17' WHEN idade BETWEEN 18 AND 34 THEN '18-34' WHEN idade BETWEEN 35 AND 54 THEN '35-54' WHEN idade BETWEEN 55 AND 74 THEN '55-74' ELSE '75+' END AS faixa_etaria, COUNT(*) AS episodios FROM dedup WHERE sexo IN (1,2) AND idade BETWEEN 0 AND 110 GROUP BY sexo, faixa_etaria ORDER BY sexo, faixa_etaria

Mortalidade intra-hospitalar por circunstância

WITH af AS (SELECT e.dsp, e.n_ficticio_utente, e.hospital, e.data_entrada, CASE WHEN d.codigo LIKE 'W32%' OR d.codigo LIKE 'W33%' OR d.codigo LIKE 'W34%' THEN 'Acidente' WHEN d.codigo LIKE 'X72%' OR d.codigo LIKE 'X73%' OR d.codigo LIKE 'X74%' THEN 'Auto-infligida' WHEN d.codigo LIKE 'X93%' OR d.codigo LIKE 'X94%' OR d.codigo LIKE 'X95%' THEN 'Agressão' WHEN d.codigo LIKE 'Y22%' OR d.codigo LIKE 'Y23%' OR d.codigo LIKE 'Y24%' THEN 'Intenção indeterminada' WHEN d.codigo LIKE 'Y350%' THEN 'Intervenção legal' ELSE 'Outro' END AS circunstancia FROM episodes e JOIN diagnoses d ON d.ano = e.ano AND d.hospital = e.hospital AND d.data_entrada = e.data_entrada AND d.n_ficticio_utente = e.n_ficticio_utente AND d.icd_versao = e.icd_versao WHERE e.tipo_port_apr31 = 'Int' AND e.icd_versao = '10' AND (d.codigo LIKE 'W32%' OR d.codigo LIKE 'W33%' OR d.codigo LIKE 'W34%' OR d.codigo LIKE 'X72%' OR d.codigo LIKE 'X73%' OR d.codigo LIKE 'X74%' OR d.codigo LIKE 'X93%' OR d.codigo LIKE 'X94%' OR d.codigo LIKE 'X95%' OR d.codigo LIKE 'Y22%' OR d.codigo LIKE 'Y23%' OR d.codigo LIKE 'Y24%' OR d.codigo LIKE 'Y350%')), dedup AS (SELECT DISTINCT dsp, n_ficticio_utente, hospital, data_entrada, circunstancia FROM af) SELECT circunstancia, COUNT(*) AS total, SUM(CASE WHEN dsp = 20 THEN 1 ELSE 0 END) AS obitos, ROUND(100.0 * SUM(CASE WHEN dsp = 20 THEN 1 ELSE 0 END) / COUNT(*), 1) AS mortalidade_pct FROM dedup GROUP BY circunstancia ORDER BY mortalidade_pct DESC

Top 15 hospitais por volume de internamentos

WITH af AS (SELECT e.hospital, e.n_ficticio_utente, e.data_entrada FROM episodes e JOIN diagnoses d ON d.ano = e.ano AND d.hospital = e.hospital AND d.data_entrada = e.data_entrada AND d.n_ficticio_utente = e.n_ficticio_utente AND d.icd_versao = e.icd_versao WHERE e.tipo_port_apr31 = 'Int' AND e.icd_versao = '10' AND (d.codigo LIKE 'W32%' OR d.codigo LIKE 'W33%' OR d.codigo LIKE 'W34%' OR d.codigo LIKE 'X72%' OR d.codigo LIKE 'X73%' OR d.codigo LIKE 'X74%' OR d.codigo LIKE 'X93%' OR d.codigo LIKE 'X94%' OR d.codigo LIKE 'X95%' OR d.codigo LIKE 'Y22%' OR d.codigo LIKE 'Y23%' OR d.codigo LIKE 'Y24%' OR d.codigo LIKE 'Y350%')), dedup AS (SELECT DISTINCT hospital, n_ficticio_utente, data_entrada FROM af) SELECT hospital, COUNT(*) AS episodios FROM dedup GROUP BY hospital ORDER BY episodios DESC LIMIT 15

O jornalismo independente (só) depende dos leitores.

Não dependemos de grupos económicos nem do Estado. Não fazemos fretes. Fazemos jornalismo para os leitores, mas só sobreviveremos com o seu apoio financeiro.