66

我有一张桌子,我需要以下列方式呈现输出。

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

有人可以帮我调整查询以实现输出。注意:我无法在此范围内添加总和。它是更大程序的一部分,因此我无法为此添加超级查询。

4

8 回答 8

147
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

您可以在此处查看此请求的输出

于 2013-07-31T16:01:02.283 回答
14

根据您的 SQL 风格,您还可以在聚合计数中隐含 else 语句

例如,这是一个简单的表格Grades

| Letters |
|---------|
| A       |
| A       |
| B       |
| C       |

我们可以像这样测试每个聚合计数器语法(SQL Fiddle 中的 Interactive Demo):

SELECT
    COUNT(CASE WHEN Letter = 'A' THEN 1 END)           AS [Count - End],
    COUNT(CASE WHEN Letter = 'A' THEN 1 ELSE NULL END) AS [Count - Else Null],
    COUNT(CASE WHEN Letter = 'A' THEN 1 ELSE 0 END)    AS [Count - Else Zero],
    SUM(CASE WHEN Letter = 'A' THEN 1 END)             AS [Sum - End],
    SUM(CASE WHEN Letter = 'A' THEN 1 ELSE NULL END)   AS [Sum - Else Null],
    SUM(CASE WHEN Letter = 'A' THEN 1 ELSE 0 END)      AS [Sum - Else Zero]
FROM Grades

以下是结果(为了便于阅读,未透视):

|    Description    | Counts |
|-------------------|--------|
| Count - End       |    2   |
| Count - Else Null |    2   |
| Count - Else Zero |    4   | *Note: Will include count of zero values
| Sum - End         |    2   |
| Sum - Else Null   |    2   |
| Sum - Else Zero   |    2   |

这与SQL 中的聚合函数的文档一致

文档COUNT

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

文档SUM

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

于 2018-08-30T20:54:41.497 回答
13

关闭...尝试:

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
于 2013-07-31T16:01:15.797 回答
2

您得到两行而不是一行的原因是您rsp_ind在外部查询中进行分组(令我失望的是,您没有与我们分享)。在不处理该GROUP BY项目的情况下,您无法强制一行而不是两行。

于 2013-07-31T16:21:22.900 回答
1

如果要基于列对结果进行分组并基于相同的计数,可以将查询运行为:

$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";
于 2019-08-20T10:41:04.250 回答
1
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;
于 2020-05-18T22:43:10.290 回答
1

好的。我解决了

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
于 2019-05-24T11:40:30.290 回答
0
select sum(rsp_ind = 0) as `New`,
       sum(rsp_ind = 1) as `Accepted` 
from tb_a
于 2013-07-31T16:02:26.223 回答