在case语句中使用sql计数

在case语句中使用sql计数,sql,Sql,我有一个表,我需要以以下方式显示输出 tb_a: col1 | reg_id | rsp_ind rsp_ind=0为“新”且1为“已接受”的行数 输出应该是 NEW | Accepted 9 | 10 我尝试使用以下查询 select case when rsp_ind = 0 then count(reg_id)end as 'New', case when rsp_ind = 1 then count(reg_id)end as 'Accepted' from t

我有一个表,我需要以以下方式显示输出

tb_a:

col1  |  reg_id | rsp_ind 
rsp_ind=0为“新”且1为“已接受”的行数

输出应该是

NEW | Accepted
9   | 10
我尝试使用以下查询

select 
  case when rsp_ind = 0 then count(reg_id)end as 'New',
  case when rsp_ind = 1 then count(reg_id)end as 'Accepted'
from tb_a
我得到的输出是

NEW | Accepted
NULL| 10
9   | NULL
有人能帮我调整查询以获得输出吗。 注意:我不能在这周围加一个总数。它是一个更大的程序的一部分,所以我不能向它添加超级查询

SELECT 
    COUNT(CASE WHEN rsp_ind = 0 then 1 ELSE NULL END) as "New",
    COUNT(CASE WHEN rsp_ind = 1 then 1 ELSE NULL END) as "Accepted"
from tb_a
您可以看到此请求的输出

关闭。。。尝试:

select 
   Sum(case when rsp_ind = 0 then 1 Else 0 End) as 'New',
   Sum(case when rsp_ind = 1 then 1 else 0 end) as 'Accepted'
from tb_a

您得到两行而不是一行的原因是您在外部查询中按
rsp\u ind
进行分组(令我失望的是,您没有与我们共享)。如果不处理
分组依据
项,就无法强制执行一行而不是两行。

根据您的SQL风格,您还可以在聚合计数中添加

例如,这里有一个简单的表
等级

|字母|
|---------|
|A|
|A|
|B|
|C |
我们可以像这样()测试每个聚合计数器语法:

选择
计数(字母='A'然后是1结尾时的大小写)为[COUNT-END],
计数(字母='A'然后为1 ELSE NULL END时的大小写)为[COUNT-ELSE NULL],
计数(字母='A'然后1 ELSE 0结束时的大小写)为[计数-ELSE零],
SUM(字母='A'然后是1结尾时的大小写)为[SUM-END],
SUM(字母='A'然后1 ELSE NULL END时的大小写)为[SUM-ELSE NULL],
求和(字母='A'然后1或0结束时的情况)为[求和-或零]
分级
以下是结果(为了可读性):

|说明|计数|
|-------------------|--------|
|计数-结束| 2|
|计数-否则为空| 2|
|计数-否则为零| 4 |*注:将包括零值计数
|总和-结束| 2|
|总和-否则为空| 2|
|求和-否则为零| 2 |
哪一个与

以下文件:

COUNT(*)
-返回组中的项目数。这包括空值和重复项。
COUNT(ALL expression)
-计算组中每一行的表达式,并返回非空值的数目。
COUNT(DISTINCT expression)
-计算组中每一行的表达式,并返回唯一非空值的数目

以下文件:

ALL
-将聚合函数应用于所有值。全部为默认值。
DISTINCT
-指定总和返回唯一值的总和

嗯。我解决了

SELECT `smart_projects`.project_id, `smart_projects`.business_id, `smart_projects`.title,
 `page_pages`.`funnel_id` as `funnel_id`, count(distinct(page_pages.page_id) )as page_count, count(distinct (CASE WHEN page_pages.funnel_id != 0 then  page_pages.funnel_id ELSE NULL END ) ) as funnel_count
FROM `smart_projects`
LEFT JOIN `page_pages` ON `smart_projects`.`project_id` = `page_pages`.`project_id`
WHERE  smart_projects.status !=  0 
AND `smart_projects`.`business_id` = 'cd9412774edb11e9'
GROUP BY `smart_projects`.`project_id`
ORDER BY `title` DESC

如果要基于列对结果进行分组并基于该列进行计数,则可以按以下方式运行查询:

$sql = "SELECT COLUMNNAME,

COUNT(CASE WHEN COLUMNNAME IN ('YOURCONDITION') then 1 ELSE NULL END) as 'New',

COUNT(CASE WHEN COLUMNNAME IN ('YOURCONDITION') then 1 ELSE NULL END) as 'ACCPTED'

FROM TABLENAME

GROUP BY COLUMNANME";

您不能添加总和,但可以更改查询吗?或者将其作为子查询?我可以添加子查询而不是case语句。但这不是一个超级查询。。。添加子查询显然会影响性能…我明白了。。然后,也许您可以将此子查询添加到join子句中,而不是进行内联子查询。在您的代码中,这可能吗?请显示您的整个查询,特别是您的
GROUP BY
子句!还有,什么数据库管理系统和版本--Oracle,MySQL,SQL Server 2008,什么?你用的是什么数据库引擎?这与OP的要求不符for@JafarKofahi请随意解释!在我看来,这正是他所渴望的……在这篇专栏文章中,他说:“注意:我不能在这上面加一个总数。这是”告诉我你在哪里看到一个和?我想他的意思是他不能使用任何聚合函数,因为这是一个更大查询的一部分,因为他不能添加一个
group by
,这与OP要求的不符OP说这给了他两行而不是一行。仅输入错误-省略了一个右括号。令人惊讶的是,它居然起作用了。我确信他找到了括号,我确信它的缺失并不是导致出现两行而不是一行的原因。“伤害你的不是你不知道的东西,而是你知道的东西不是这样。”OP给出的一个重要细节没有说明这是什么DBMS。
$sql = "SELECT COLUMNNAME,

COUNT(CASE WHEN COLUMNNAME IN ('YOURCONDITION') then 1 ELSE NULL END) as 'New',

COUNT(CASE WHEN COLUMNNAME IN ('YOURCONDITION') then 1 ELSE NULL END) as 'ACCPTED'

FROM TABLENAME

GROUP BY COLUMNANME";
CREATE TABLE #CountMe (Col1 char(1));

INSERT INTO #CountMe VALUES ('A');
INSERT INTO #CountMe VALUES ('B');
INSERT INTO #CountMe VALUES ('A');
INSERT INTO #CountMe VALUES ('B');

SELECT
    COUNT(CASE WHEN Col1 = 'A' THEN 1 END) AS CountWithoutElse,
    COUNT(CASE WHEN Col1 = 'A' THEN 1 ELSE NULL END) AS CountWithElseNull,
    COUNT(CASE WHEN Col1 = 'A' THEN 1 ELSE 0 END) AS CountWithElseZero
FROM #CountMe;