2017-04-11 65 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'。但是,对于简单的字符串比较,您不需要考虑这种微观优化。 –