2015-01-20 142 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