2014-03-02 84 views
0

我有以下表格:MySQL的聚合函數內加入

CREATE TABLE `funds_balance` (
    `idBUSINESS` int(11) NOT NULL, 
    `PREMIUM_POSITIONS_CREDIT` decimal(18,2) NOT NULL DEFAULT '0.00', 
    PRIMARY KEY (`idBUSINESS`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `elevated_business_queue` (
    `idBUSINESS` int(11) NOT NULL, 
    `KEYWORD_TEXT` varchar(200) NOT NULL, 
    `CITY` varchar(50) NOT NULL, 
    `BID_AMOUNT` decimal(18,2) NOT NULL, 
    `NO_OF_DAYS` int(11) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

我想選擇從有足夠的資金來支付他們從funds_balance表中的所有出價elevated_business_queue表業務。我想出了以下查詢:

SELECT ebq.idBUSINESS 
    , KEYWORD_TEXT 
    , CITY 
    , BID_AMOUNT 
    FROM elevated_business_queue ebq 
    JOIN funds_balance fb 
    ON fb.idBUSINESS = ebq.idBUSINESS 
GROUP 
    BY idBUSINESS 
HAVING PREMIUM_POSITIONS_CREDIT >= (SUM(ebq.BID_AMOUNT) + (ROUND((12.36/100)*SUM(ebq.BID_AMOUNT)), 2)); 

但它不起作用。我收到錯誤未知列PREMIUM_POSITIONS_CREDIT。爲什麼?

+0

Premium_positions_credit不是在結果集中 – Strawberry

回答

2

HAVING條款過濾器在查詢序列的「結束」來選擇PREMIUM_POSITIONS_CREDIT,只能在其上查詢實際選擇下地幹活。由於您的字段列表中沒有包含PREMIUM_POSTIIONS_CREDIT,因此它不存在於結果集中,因此HAVING無法對其進行過濾。

根本就

SELECT PREMIUM_POSITIONS_CREDIT, rest,of,the,fields 

,它就會開始工作。

例如

mysql> CREATE TABLE foo (int x, int y); 
Query OK, 0 rows affected (0.11 sec) 

mysql> INSERT INTO foo (x,y) VALUES (1,1); 
Query OK, 1 row affected (0.05 sec) 
Records: 1 Duplicates: 0 Warnings: 0 

mysql> SELECT x FROM foo HAVING y=1 
ERROR 1054 (42S22): Unknown column 'y' in 'having clause' 

mysql> select x,y from foo having y=1; 
+------+------+ 
| x | y | 
+------+------+ 
| 1 | 1 | 
+------+------+ 
1 row in set (0.00 sec) 
+0

嘗試過,但現在我得到錯誤 - 錯誤代碼:1241.操作數應該包含1列。新的select語句是SELECT ebq.idBUSINESS,KEYWORD_TEXT,CITY,BID_AMOUNT,\t fb.PREMIUM_POSITIONS_CREDIT –

+0

在round()的東西中你有不正確的'()'括號。你的',2'實際上是round()調用的外部。 –

+0

現在運行 - 謝謝 –

2

,如果您使用的是having子句必須在選擇statment

+0

如果我把它添加到這樣的select語句:SELECT ebq.idBUSINESS,KEYWORD_TEXT,市,BID_AMOUNT,\t fb.PREMIUM_POSITIONS_CREDIT ----我得到的錯誤:錯誤代碼:1241.操作數應該包含1列。 –