2015-09-28 114 views
1

我需要運行以下兩個查詢上的Sybase引擎內執行兩項(具有不同的條件):相同的SQL請求

SELECT COUNT(*) AS BTB_YES FROM FXMM_EVT_DBF WHERE M__INTID_ = '1.511' AND M_ISHEDGE = 1 
SELECT COUNT(*) AS BTB_NO FROM FXMM_EVT_DBF WHERE M__INTID_ = '1.511' AND M_ISHEDGE = 0 

因爲我基本上選擇一組相同的信息,即:

SELECT M_ISHEDGE 
FROM FXMM_EVT_DBF 
WHERE M__INTID_ = '1.511' 

然後我用兩個單獨的條件計算這個列兩次,我覺得有一種方法可以在同一個單一查詢上得到結果,這將是很好的,因爲上述查詢必須在多個數據庫上運行。

但是,我無法獲得共同的結果,可能是因爲我不擅長SQL。我的嘗試是:

SELECT M_ISHEDGE 
FROM FXMM_EVT_DBF WHERE M__INTID_ = '1.511' 
CASE WHEN M_ISHEDGE = 1 
    then count(*) 
    else 0 
END AS BTB_YES 
CASE WHEN M_ISHEDGE = 0 
    then count(*) 
    else 0 
END AS BTB_NO 

但上述失敗,出現以下錯誤:

An error occurred when executing the SQL command: 
SELECT M_ISHEDGE 
FROM FXMM_EVT_DBF WHERE M__INTID_ = '1.511' 
CASE WHEN M_ISHEDGE = 1 
    then count(*) 
    else 0 
END AS BTB_Y... 
Incorrect syntax near the keyword 'CASE'. [SQL State=ZZZZZ, DB Errorcode=156] 

Execution time: 0s 

1 statement(s) failed. 

和SQL編輯器似乎並沒有認識到關鍵字THEN,雖然它是文檔的一部分,所以可能由於語法錯誤。

+0

由於您想在M_ISHEDGE = 1或0時進行計數,只需按該列進行分組。計數錯誤計算正確,你生病得到兩行結果(每M_ISHEDGE值一個) – jean

回答

1

你要移動這樣count函數內部的情況表達:

SELECT 
    COUNT(CASE WHEN M_ISHEDGE = 1 then m_ishedge end) AS BTB_YES, 
    COUNT(CASE WHEN M_ISHEDGE = 0 then m_ishedge end) AS BTB_NO 
FROM 
    FXMM_EVT_DBF 
WHERE 
    M__INTID_ = '1.511' 

由於case表達式,如果沒有when條件相匹配,你可以省略else部分返回null(和count只能算作非空值)。

+0

謝謝,這樣寫就更有意義;不幸的是,我似乎無法真正運行它,因爲我的工作臺不能識別關鍵字THEN,我真的不知道爲什麼,因爲它應該像[文檔](http://infocenter.sybase.com/幫助/ index.jsp的?主題=/com.sybase.infocenter.dc00801.1510/HTML/iqrefso/X315691.htm)。我會試着弄清楚出了什麼問題,然後回過頭來接受答案,一旦它有效,謝謝! –

+0

儘管ANSI標準語法應該可以工作(根據您鏈接的文檔),您可以使用搜索到的案例嘗試替代語法:'COUNT(CASE M_ISHEDGE WHEN 1 M_ISHEDGE end)AS BTB_YES,' – jpw

+0

我終於使用了您的解決方案與寫評論的COUNT聲明),並且必須刪除最後的「;」以使其工作。就在你想在答案的正文中糾正它......非常感謝jpw! –

1

您對case表達式有正確的想法,但正如您注意到的那樣,錯誤的語法。這裏的想法是,count省略null S,所以你會希望將count函數本身適用於case表達:

SELECT COUNT (CASE M_ISHEDGE WHEN 1 THEN 1 ELSE NULL END) AS BTB_YES, 
     COUNT (CASE M_ISHEDGE WHEN 0 THEN 1 ELSE NULL END) AS BTB_NO 
FROM FXMM_EVT_DBF 
WHERE M__INTID_ = '1.511' 
+0

謝謝,這樣寫就更有意義;不幸的是,我似乎無法真正運行它,因爲我的工作臺不能識別關鍵字THEN,我真的不知道爲什麼,因爲它應該像[文檔](http://infocenter.sybase.com/幫助/ index.jsp的?主題=/com.sybase.infocenter.dc00801.1510/HTML/iqrefso/X315691.htm)。我會盡力弄清楚什麼是錯誤的,一旦我明白了什麼是錯誤的,請回復你,謝謝! –