SQL:使用 case 表达式比较来自其他列的值的条件列的值
SQL: Using case expression to compare values from column Conditional on Values of Other Column
对于我的示例,我有(假的)犯罪数据,其中包含三列:城市、犯罪数量和时间段(包含时间段 1 和 2)。我需要创建一个 table,其中 city
作为一列,crime_reduced
作为另一列,它指示所犯罪行是否从时间段 1 减少到时间段 2。
我如何设置条件来测试周期 2 中的 crimes_committed
小于周期 1 中的 crimes_committed
?我的约束是我无法保存 table 的物理副本,因此我无法将我的 table 拆分为时间段 1 的一个和时间段二的另一个。我尝试了以下带有 case 表达式的代码,回想起来这毫无意义。
SELECT city,
CASE WHEN time_period = 1 AND crimes_committed > time_period = 2
AND crimes_committed THEN 1
ELSE 0 END AS crime_reduced
FROM crime_data
GROUP BY city;
编辑:不幸的是,我无法使用大小写符号表达式(这可能是平台问题)。虽然这导致了这个问题——有没有办法在一个案例中嵌入一个案例表达式(这将允许在不创建子查询的情况下获得正确的结果)?看起来像下面的东西(这在 Teradata 中不起作用):
SELECT city,
SUM(CASE WHEN
(CASE WHEN time_period = 1 THEN crimes_commited END) > (CASE WHEN time_period = 2
THEN crimes_committed END)
THEN 1 ELSE 0 END) AS crime_reduced
FROM crime_data
GROUP BY city;
您可以加入 table 的两个子查询,每个子查询查询不同的时期:
SELECT t1.city,
CASE WHEN t1.crimes_committed > t2.crimes_committed THEN 'Yes'
ELSE 'No'
END AS crimes_reduced
FROM (SELECT city, crimes_committed
FROM crime_data
WHERE period = 1) t1
JOIN (SELECT city, crimes_committed
FROM crime_data
WHERE period = 2) t2 ON t1.city = t2.city
你需要一个条件 CASE
:
SELECT city,
CASE SIGN(-- data for 1st period
MAX(CASE WHEN time_period = 1 THEN crimes_committed END) -- data for 2nd period
- MAX(CASE WHEN time_period = 2 THEN crimes_committed END))
WHEN 0 THEN 'Same'
WHEN 1 THEN 'Decreased'
WHEN -1 THEN 'Increased'
ELSE 'Unkown (no data)'
END
FROM crime_data
GROUP BY city;
对于我的示例,我有(假的)犯罪数据,其中包含三列:城市、犯罪数量和时间段(包含时间段 1 和 2)。我需要创建一个 table,其中 city
作为一列,crime_reduced
作为另一列,它指示所犯罪行是否从时间段 1 减少到时间段 2。
我如何设置条件来测试周期 2 中的 crimes_committed
小于周期 1 中的 crimes_committed
?我的约束是我无法保存 table 的物理副本,因此我无法将我的 table 拆分为时间段 1 的一个和时间段二的另一个。我尝试了以下带有 case 表达式的代码,回想起来这毫无意义。
SELECT city,
CASE WHEN time_period = 1 AND crimes_committed > time_period = 2
AND crimes_committed THEN 1
ELSE 0 END AS crime_reduced
FROM crime_data
GROUP BY city;
编辑:不幸的是,我无法使用大小写符号表达式(这可能是平台问题)。虽然这导致了这个问题——有没有办法在一个案例中嵌入一个案例表达式(这将允许在不创建子查询的情况下获得正确的结果)?看起来像下面的东西(这在 Teradata 中不起作用):
SELECT city,
SUM(CASE WHEN
(CASE WHEN time_period = 1 THEN crimes_commited END) > (CASE WHEN time_period = 2
THEN crimes_committed END)
THEN 1 ELSE 0 END) AS crime_reduced
FROM crime_data
GROUP BY city;
您可以加入 table 的两个子查询,每个子查询查询不同的时期:
SELECT t1.city,
CASE WHEN t1.crimes_committed > t2.crimes_committed THEN 'Yes'
ELSE 'No'
END AS crimes_reduced
FROM (SELECT city, crimes_committed
FROM crime_data
WHERE period = 1) t1
JOIN (SELECT city, crimes_committed
FROM crime_data
WHERE period = 2) t2 ON t1.city = t2.city
你需要一个条件 CASE
:
SELECT city,
CASE SIGN(-- data for 1st period
MAX(CASE WHEN time_period = 1 THEN crimes_committed END) -- data for 2nd period
- MAX(CASE WHEN time_period = 2 THEN crimes_committed END))
WHEN 0 THEN 'Same'
WHEN 1 THEN 'Decreased'
WHEN -1 THEN 'Increased'
ELSE 'Unkown (no data)'
END
FROM crime_data
GROUP BY city;