在同一 SQL 请求中执行两次计数(条件不同)

Perform two counts (with different conditions) within the same SQL request

我必须运行 Sybase 引擎上的以下两个查询:

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同一套资料,即:

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,尽管它是文档的一部分,所以可能是因为某些语法错误。

您对 case 表达式的想法是正确的,但是,正如您所注意到的,语法错误。这里的想法是 count 省略 nulls,因此您希望将 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'

您需要像这样在计数函数中移动 case 表达式:

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 表达式 returns null 如果没有 when 条件匹配,您可以省略 else 部分(并且仅 count计算非空值)。