2017-04-11 55 views
-1

在此代碼其能夠分別互爲別名case語句等不能夠在巢式病例別名列名,使用SQL查詢

SELECT 
    id, 
    SUM(CASE 
      WHEN (a.place = 'CHN' AND a.salary = 20000) 
       THEN '1' 
       ELSE '0' 
     END) AS '20K Salary', 
    SUM(CASE 
      WHEN (a.place = 'CHN' and a.salary = 35000) 
       THEN '1' 
       ELSE '0' 
     END) AS '35K Salary' 
FROM Employee a; 

但嵌套CASE當使用語句,

SELECT 
    id, 
    SUM(CASE 
      WHEN (a.place = 'CHN') 
       THEN (CASE 
         WHEN a.salary = 20000 
          THEN '1' 
          ELSE '0' 
        END) AS '20K Salary', 
        (CASE 
         WHEN a.salary = 35000 
          THEN '1' 
          ELSE '0' 
        END) AS '35K Salary' 
     END) 
FROM Employee a; 

它不可能執行查詢

+0

如何找到Sum('True','False')'。沒有整數值被用於查詢中的sum()函數。 –

+0

當你做'SUM'('YES')'時,你期望得到什麼? SUM可以應用於**數值** - 不是字符串,真的..... –

+0

我需要在嵌套的情況下別名列 –

回答

0

在第一組代碼中,每個case語句都是SELECT列表的一部分(即它們在SELECT之後的逗號分隔列表中)每個都返回一列。在第二組代碼中,SELECT列表中只有一個case語句,它嵌套的事實對此沒有影響。此外,嵌套大小寫的語法不正確,因爲THEN部分之後是兩個用逗號分隔的表達式,這是不允許的。

+0

是否有機會向別名添加別名嵌套的情況 –

+0

我不這麼認爲,別名只適用於列和表。在第二組代碼中,您可以通過在最後一行的第二行末尾添加AS別名來給外部大小寫別名 – Ant20

+0

我不清楚您想要實現的目標。第一組代碼如何達不到你想要的? – Ant20

0

當然這是可以做你想做的。你想創建列,所以每個需要它自己的邏輯和自己的別名:

SELECT id, 
     SUM(CASE WHEN a.place = 'CHN' AND a.salary = 20000 THEN 1 ELSE 0 
      END) as Salary_20K, 
     SUM(CASE WHEN a.place = 'CHN' AND a.salary = 35000 THEN 1 ELSE 0 
      END) as Salary_35K 
FROM Employee a; 

注意:不要把數字常量的單引號。只對字符串和日期常量使用單引號。

+0

由於'CHN'在兩種情況下都很常見,所以可以首先檢查地點,如果滿意那麼我們可以檢查工資並將其保存在Salary_20K和Salary_35k –

+0

@Daemon_Demon中。 。 。你可以將條件移到'where'子句,但是它會過濾掉沒有'CHN'行的任何'id'。但是,對於簡單的字符串比較,您不需要考慮這種微觀優化。 –