SQL:使用case表达式来比较其他列的值Conditional on columns的值

时间:2015-10-01 20:56:46

标签: sql select case teradata

在我的例子中,我有(假)犯罪数据有三列:城市,犯罪数量和时间段(包含时间段1和2)。我需要创建一个表格,其中city为一列,crime_reduced为另一列,表明所犯罪行是否从第1期减少到第2期。

我如何设置条件来测试第2期中crimes_committed在第1期中是否小于crimes_committed?我的约束是我无法保存表的物理副本,所以我不能将我的表拆分为时间段为1的表,而另一个时间段为2。我尝试使用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;

2 个答案:

答案 0 :(得分:1)

您可以加入表格的两个子查询,每个查询查询不同的时间段:

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 

答案 1 :(得分:0)

您需要条件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;