2015-01-20 58 views
0

我有这个疑问:使用函数SUM?

Select t1.col5, 
 
     t1.col6, 
 
     SUM(CASE WHEN t2.col1 = 'A' THEN t2.col2 ELSE 0 
 
       WHEN t2.col1 = 'B' THEN t2.col2 * -1 ELSE 0 
 
     END) AS price, 
 
     SUM(CASE WHEN t2.col1 = 'C' THEN t2.col2 + 100 ELSE 0 
 
     END) AS bonus 
 
     FROM t1, t2 
 
     WHERE t1.col1 = t2.col4 
 
     AND (price + bonus) <> 0 
 
     GROUP BY t1.col5, 
 
       t1.col6

,但我不能这样做(价格+奖金)<> 0?我有这个消息:价格无效的标识符! 我怎么能在WHERE中使用我的SUM的名字? 谢谢:)

回答

0

不能使用列别名(或者,就此而言,汇总s)在WHERE条款中。所以你想要做的就是使用子查询,或者把聚合放在HAVING子句中。我会告诉下面的子查询,我认为这是容易,因为你没有重现所有按键(你需要使用的聚集本身,而不是他们的别名,在HAVING条款):

SELECT * FROM (
    Select t1.col5, 
      t1.col6, 
      SUM(CASE WHEN t2.col1 = 'A' THEN t2.col2 ELSE 0 
       WHEN t2.col1 = 'B' THEN t2.col2 * -1 ELSE 0 
      END) AS price, 
      SUM(CASE WHEN t2.col1 = 'C' THEN t2.col2 + 100 ELSE 0 
      END) AS bonus 
     FROM t1, t2 
     WHERE t1.col1 = t2.col4 
     GROUP BY t1.col5, 
      t1.col6 
) WHERE (price + bonus) <> 0 
0

您不能使用别名 - 检查出的操作顺序在一个SQL查询:http://www.bennadel.com/blog/70-sql-query-order-of-operations.htm

你需要尝试是这样的:

Select t1.col5, 
     t1.col6, 
     SUM(CASE WHEN t2.col1 = 'A' THEN t2.col2 ELSE 0 
       WHEN t2.col1 = 'B' THEN t2.col2 * -1 ELSE 0 
     END) AS price, 
     SUM(CASE WHEN t2.col1 = 'C' THEN t2.col2 + 100 ELSE 0 
     END) AS bonus 
     FROM t1, t2 
     WHERE t1.col1 = t2.col4 
     AND (SUM(CASE WHEN t2.col1 = 'A' THEN t2.col2 ELSE 0 WHEN t2.col1 = 'B' THEN t2.col2 * -1 ELSE 0 END) 
      + 
      SUM(CASE WHEN t2.col1 = 'C' THEN t2.col2 + 100 ELSE 0 END)) <> 0 
      GROUP BY t1.col5, 
        t1.col6 
+0

聚合需要进入'HAVING'子句 - 它们不能在WHERE子句中。 – 2015-01-20 20:39:28

1

上约束聚合函数需要在HAVING子句来完成:

Select t1.col5, 
     t1.col6, 
     SUM(CASE WHEN t2.col1 = 'A' THEN t2.col2 ELSE 0 
       WHEN t2.col1 = 'B' THEN t2.col2 * -1 ELSE 0 
     END) AS price, 
     SUM(CASE WHEN t2.col1 = 'C' THEN t2.col2 + 100 ELSE 0 
     END) AS bonus 
     FROM t1, t2 
     WHERE t1.col1 = t2.col4 

     GROUP BY t1.col5, 
       t1.col6 
    having SUM(CASE WHEN t2.col1 = 'A' THEN t2.col2 ELSE 0 
       WHEN t2.col1 = 'B' THEN t2.col2 * -1 ELSE 0 
     END) + SUM(CASE WHEN t2.col1 = 'C' THEN t2.col2 + 100 ELSE 0 
     END) <> 0