Explorando Dados da Covid-19 com SQL no Microsoft SQL Server

Antonio Barros
6 min readOct 3, 2023

Neste artigo, exploraremos diversas consultas SQL que utilizam várias técnicas e recursos para analisar dados relacionados à Covid-19. As habilidades envolvidas incluem Joins, CTE’s (Common Table Expressions), Temp Tables (Tabelas Temporárias), Funções de Janelas (Windows Functions), Funções de Agregação, Criação de Views e Conversão de Tipos de Dados. Vamos examinar cada consulta e seu objetivo.

1. Listando as 5 Primeiras Entradas de Mortes por Covid-19 e Vacinações

SELECT TOP(5) *
FROM PortfolioProject..CovidDeaths
ORDER BY location, date DESC

SELECT TOP(5) *
FROM PortfolioProject..CovidVaccinations
ORDER BY location, date DESC

Estas consultas retornam as 5 primeiras entradas das tabelas “CovidDeaths” e “CovidVaccinations”, ordenadas pelas colunas “location” e “date”. É um bom ponto de partida para uma análise inicial dos dados, verificando se os dados foram importados corretamente, se estão no formato esperado e entender a estrutura da tabela e quais informações estão disponíveis.

2. Comparando Casos Totais e Mortes Totais no Brasil

SELECT location, date, total_cases, total_deaths, (total_deaths / total_cases)*100 AS DeathPercentage
FROM PortfolioProject..CovidDeaths
WHERE location LIKE 'brazil'
ORDER BY 1,2 DESC

Esta consulta calcula a porcentagem de mortes em relação aos casos totais de Covid-19 no Brasil ao longo do tempo, fornecendo informações sobre a probabilidade de óbito após a infecção.

3. Porcentagem da População Infectada por Covid-19

SELECT location, date, population, total_cases, (total_cases / population )*100 AS PercentPopulationInfected
FROM PortfolioProject..CovidDeaths
ORDER BY 1,2 DESC

Aqui, calculamos a porcentagem da população infectada com Covid-19 ao longo do tempo, fornecendo insights sobre a disseminação da doença em relação à população total.

4. Países com Maior Taxa de Infecção em Relação à População

SELECT location, population, MAX(total_cases) AS HighestInfectionCount, MAX((total_cases / population))*100 AS PercentPopulationInfected
FROM PortfolioProject..CovidDeaths
GROUP BY Location, Population
ORDER BY PercentPopulationInfected DESC

Esta consulta identifica os países com a maior taxa de infecção em relação à sua população, destacando áreas com maior propagação da Covid-19 em comparação com o tamanho da população.

5. Países com o Maior Número Total de Mortes

SELECT location, MAX(total_deaths) AS TotalDeathCount
FROM PortfolioProject..CovidDeaths
WHERE continent IS NOT NULL
GROUP BY location
ORDER BY TotalDeathCount DESC

Aqui, encontramos os países com o maior número total de mortes por Covid-19, o que é fundamental para entender o impacto da pandemia em diferentes nações.

6. Maior Número de Mortes em Relação à População

SELECT location, population, MAX(total_deaths) AS TotalDeathCount, MAX((total_deaths / population))*100 AS PercentPopulationDeath
FROM PortfolioProject..CovidDeaths
WHERE continent IS NOT NULL
GROUP BY location, population
ORDER BY PercentPopulationDeath DESC

Esta consulta destaca os países com a maior taxa de mortes em relação à sua população, fornecendo uma visão mais precisa da gravidade da situação em diferentes regiões.

7. Número Total de Mortes por Continente

SELECT continent, MAX(total_deaths) AS TotalDeathCount
FROM PortfolioProject..CovidDeaths
WHERE continent IS NOT NULL
GROUP BY continent
ORDER BY TotalDeathCount DESC

Aqui, identificamos o total de mortes por Covid-19 por continente, o que ajuda a compreender a disseminação geográfica da pandemia.

8. Estatísticas Globais Diárias

SELECT date, SUM(new_cases) AS global_cases, SUM(new_deaths) AS global_deaths, (SUM(new_deaths) / NULLIF(SUM(new_cases),0))*100 AS DeathPercentage
FROM PortfolioProject..CovidDeaths
WHERE continent IS NOT NULL
GROUP BY date
ORDER BY 1

Nesta consulta, calculamos as estatísticas globais diárias, incluindo novos casos e mortes, bem como a taxa de mortalidade global. Isso ajuda a rastrear o progresso da pandemia ao longo do tempo.

9. Estatísticas Globais Totais

SELECT SUM(new_cases) AS global_cases, SUM(new_deaths) AS global_deaths, (SUM(new_deaths) / NULLIF(SUM(new_cases),0))*100 AS DeathPercentage
FROM PortfolioProject..CovidDeaths
WHERE continent IS NOT NULL

Esta consulta fornece as estatísticas globais totais de casos e mortes por Covid-19, bem como a taxa de mortalidade global, oferecendo uma visão geral do impacto da pandemia em todo o mundo.

10. Relação entre População e Vacinações

SELECT dea.continent, dea.location, dea.date, dea.population, vac.new_vaccinations
, SUM(CONVERT(numeric(10), vac.new_vaccinations)) OVER (PARTITION BY dea.location ORDER BY dea.location, dea.date) AS RollingPeopleVaccinated
FROM PortfolioProject..CovidDeaths dea
JOIN PortfolioProject..CovidVaccinations vac
ON dea.location = vac.location
AND dea.date = vac.date
WHERE dea.continent IS NOT NULL
ORDER BY 3 DESC

Nesta consulta, relacionamos a população com as vacinações, rastreando o número de pessoas vacinadas ao longo do tempo para cada localização, permitindo uma análise da cobertura vacinal.

11. Porcentagem da População Vacinada utilizando CTE

WITH PopvsVac (continent, location, date, population, new_vaccinations, RollingPeopleVaccinated)
AS
(
SELECT dea.continent, dea.location, dea.date, dea.population, vac.new_vaccinations
, SUM(CONVERT(numeric(10), vac.new_vaccinations)) OVER (PARTITION BY dea.location ORDER BY dea.location, dea.date) AS RollingPeopleVaccinated
FROM PortfolioProject..CovidDeaths dea
JOIN PortfolioProject..CovidVaccinations vac
ON dea.location = vac.location
AND dea.date = vac.date
WHERE dea.continent IS NOT NULL
)
SELECT *, (RollingPeopleVaccinated/population)*100 AS PercentagePeopleVaccinated
FROM PopvsVac

A CTE, chamada “PopvsVac,” calcula o número de pessoas vacinadas ao longo do tempo para cada localização, e em seguida, calcula a porcentagem da população que foi vacinada. Isso nos fornece uma visão clara da cobertura vacinal em várias áreas ao longo do tempo.

12. Porcentagem da População Vacinada utilizando Temp Table

DROP TABLE IF EXISTS #PercentPopulationVaccinated
CREATE TABLE #PercentPopulationVaccinated
(
Continent nvarchar(255),
Location nvarchar(255),
Date datetime,
Population numeric,
New_vaccinations numeric,
RollingPeopleVaccinated numeric
)

INSERT INTO #PercentPopulationVaccinated
SELECT dea.continent, dea.location, dea.date, dea.population, vac.new_vaccinations
, SUM(CONVERT(numeric(10), vac.new_vaccinations)) OVER (PARTITION BY dea.location ORDER BY dea.location, dea.date) AS RollingPeopleVaccinated
FROM PortfolioProject..CovidDeaths dea
JOIN PortfolioProject..CovidVaccinations vac
ON dea.location = vac.location
AND dea.date = vac.date
WHERE dea.continent IS NOT NULL

SELECT *, (RollingPeopleVaccinated/population)*100 AS PercentagePeopleVaccinated
FROM #PercentPopulationVaccinated

Nesta parte, ao invés de utilizar uma CTE, utilizamos uma tabela temporária para armazenar os resultados dos cálculos relacionados à população e às vacinações. Isso é útil quando precisamos realizar análises mais complexas ou quando desejamos armazenar resultados intermediários para uso posterior.

13. Criando uma View para Armazenar Dados

CREATE VIEW PercentPopulationVaccinated AS
SELECT dea.continent, dea.location, dea.date, dea.population, vac.new_vaccinations
, SUM(CONVERT(numeric(10), vac.new_vaccinations)) OVER (PARTITION BY dea.location ORDER BY dea.location, dea.date) AS RollingPeopleVaccinated
FROM PortfolioProject..CovidDeaths dea
JOIN PortfolioProject..CovidVaccinations vac
ON dea.location = vac.location
AND dea.date = vac.date
WHERE dea.continent IS NOT NULL

Aqui, criamos uma view chamada “PercentPopulationVaccinated” que armazena os resultados da relação entre população e vacinações. Isso é útil para facilitar consultas futuras e análises visuais.

SELECT *
FROM PercentPopulationVaccinated
WHERE date = '31-12-2021'

Por fim, podemos consultar a view “PercentPopulationVaccinated” para visualizar os dados relacionados à população e às vacinações. A cláusula WHERE filtra os dados para exibir informações específicas da data de 31 de dezembro de 2021.

Conclusão

A análise de dados desempenha um papel crucial na compreensão de eventos globais, como a pandemia da Covid-19. As consultas SQL nos permitiram explorar os dados de maneira profunda e objetiva, revelando tendências, padrões e insights importantes.

Além disso, demonstramos como armazenar resultados intermediários em tabelas temporárias e views, facilitando consultas subsequentes e análises contínuas. Isso ilustra a importância da organização e do armazenamento eficaz de dados ao lidar com conjuntos de dados complexos.

À medida que continuamos a enfrentar desafios globais de saúde, a análise de dados se torna uma ferramenta indispensável para tomada de decisões informadas. As consultas SQL apresentadas neste artigo oferecem uma base sólida para análises mais avançadas e fornecem um exemplo de como os profissionais de análise de dados podem extrair informações valiosas de uma base de dados.

Dataset extraído de: https://ourworldindata.org/covid-deaths

Confira o repositório do projeto no Github

#sql #data #dataexploration #datanalysis

--

--

Antonio Barros

Passionate about Data Analysis and dedicated to contributing to the development of solutions that enhance business outcomes.