我有疑问:
Select
Location, date, total_cases, total_deaths,
(total_deaths / total_cases) * 100 as DeathPercentage
From
PortfolioProject.dbo.CovidDeaths$
Order By
1, 2
但是当我运行它时出现这个错误:
消息 8117,级别 16,状态 1,第 24 行
操作数数据类型 nvarchar 对于除法运算符无效。
如何重写查询以便修复此错误?
我用过
SELECT
CAST(total_deaths AS Integer)
FROM
PortfolioProject.dbo.CovidDeaths$
SELECT
CAST(total_cases AS Integer)
FROM
PortfolioProject.dbo.CovidDeaths$
它返回了整数,但是当我用除法重新运行查询时,我得到了同样的错误。
由于错误消息告诉我们您正在尝试对 nvarchar 列进行 atitmetic,因此您需要将数据转换(或转换)为可以执行算术的内容。当您使用 SQL Server 时,我建议您使用
TRY_CAST()
,它是容错的,因为如果无法转换值,它会返回 NULL 而不是停止查询。所以,你可以这样做:
SELECT
Location
, [date]
, total_cases
, total_deaths
, (TRY_CAST(total_deaths AS INT) / TRY_CAST(total_cases AS INT)) * 100.0 AS DeathPercentage
FROM PortfolioProject.dbo.CovidDeaths$
ORDER BY
Location
, [date]
更进一步,您可能需要避免被零除的错误,并且您可能还需要比整数提供的更精确的数字,所以也许:
SELECT
Location
, [date]
, total_cases
, total_deaths
, (TRY_CAST(total_deaths AS NUMERIC(10, 2)) / NULLIF(TRY_CAST(total_cases AS NUMERIC(10, 2)), 0)) * 100.0 AS DeathPercentage
FROM PortfolioProject.dbo.CovidDeaths
ORDER BY
Location
, [date]
ps:“日期”不是列名的明智选择。
在评论中,您寻求有关如何“修复”nvarchar 列的帮助。这涉及几个步骤,你需要确保你有一个备份,以防它在任何时候崩溃。
-- Step 1: Create a backup copy of the table
SELECT * INTO PortfolioProject.dbo.CovidDeaths_backup
FROM PortfolioProject.dbo.CovidDeaths;
-- Step 2: Add new numeric columns to the table
ALTER TABLE PortfolioProject.dbo.CovidDeaths
ADD total_cases_numeric NUMERIC(10,2),
total_deaths_numeric NUMERIC(10,2);
-- Step 3: Set the values of the new columns using TRY_CAST
UPDATE PortfolioProject.dbo.CovidDeaths
SET total_cases_numeric = TRY_CAST(total_cases AS NUMERIC(10,2)),
total_deaths_numeric = TRY_CAST(total_deaths AS NUMERIC(10,2));
-- WARNING you may want to stop at this point! Inspect the new columns before proceeding
-- Step 4: OPTIONAL! Drop the original nvarchar columns
ALTER TABLE PortfolioProject.dbo.CovidDeaths
DROP COLUMN total_cases,
total_deaths;
-- Step 5: OPTIONAL! Rename the new numeric columns to the original names
EXEC sp_rename 'PortfolioProject.dbo.CovidDeaths.total_cases_numeric', 'total_cases', 'COLUMN';
EXEC sp_rename 'PortfolioProject.dbo.CovidDeaths.total_deaths_numeric', 'total_deaths', 'COLUMN';
如果您对此感到不舒服,请不要这样做。
nb:自始至终我都使用数字(10,2)这是一个猜测,你可以调整它以适应,或者如果你需要的话只使用整数。