【问题标题】:Perform two counts (with different conditions) within the same SQL request在同一个 SQL 请求中执行两次计数(使用不同的条件)
【发布时间】:2015-09-28 16:56:54
【问题描述】:

我必须在 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 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,虽然它是文档的一部分,所以可能是因为一些语法错误。

【问题讨论】:

  • 因为您想在 M_ISHEDGE = 1 或 0 时计数,只需按该列分组。计数将正确计算,您将在两行中得到结果(每个 M_ISHEDGE 值一个)

标签: sql select count case sybase


【解决方案1】:

您需要像这样在 count 函数中移动 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 表达式返回null,如果没有when 条件匹配,您可以省略else 部分(并且count 只计算非空值)。

【讨论】:

  • 谢谢,这样写更有意义;不幸的是,我似乎无法真正运行它,因为我的工作台无法识别关键字 THEN,我真的不知道为什么,因为它应该像 documentation 一样工作。我会尝试找出问题所在,并在它起作用后回来接受答案,谢谢!
  • 虽然 ANSI 标准语法应该可以工作(根据您链接的文档),但您可以使用搜索案例尝试替代语法:COUNT(CASE M_ISHEDGE WHEN 1 then M_ISHEDGE end) AS BTB_YES,
  • 我终于使用了您的解决方案(使用为 cmets 编写的 COUNT 语句),并且必须删除最后的“ ; ”才能使其工作。只是如果你想在答案的正文中更正它......非常感谢 jpw!
【解决方案2】:

您对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'

【讨论】:

  • 谢谢,这样写更有意义;不幸的是,我似乎无法真正运行它,因为我的工作台无法识别关键字 THEN,我真的不知道为什么,因为它应该像 documentation 一样工作。我会尝试找出问题所在,并在了解问题后尽快回复您,谢谢!
猜你喜欢
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多