在同一 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
省略 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'
您需要像这样在计数函数中移动 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
计算非空值)。
我必须运行 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
省略 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'
您需要像这样在计数函数中移动 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
计算非空值)。