簡體   English   中英

SQL:使用案例表達式比較列中的值(以其他列的值為條件)

[英]SQL: Using case expression to compare values from column Conditional on Values of Other Column

就我的示例而言,我有(偽)犯罪數據,其中包含三列:城市,犯罪數量和時間段(包含時間段1和2)。 我需要創建一個表,其中city作為一列, crime_reduced作為另一列,這是一個指標,用於指示犯罪從時間段1減少到時間段2。

如何設置條件以測試第2階段中的crimes_committed小於第1 crimes_committed中的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;

編輯:不幸的是,我無法使大小寫符號表達式起作用(這可能是平台問題)。 盡管這引發了這個問題-是否有任何方法可以將case表達式嵌入到case中(這將導致適當的結果而不會創建子查詢)? 如下所示(在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;

您可以聯接表的兩個子查詢,每個子查詢查詢不同的期間:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM