使用Count和Case确定出现的实例数

时间:2018-02-08 15:04:08

标签: sql count case

我正试图了解COUNT CASE陈述,所以对于我的例子,我有一个字母'Salutation'的表,并包含'亲爱的史密斯先生'和'亲爱的博士夫人'等数据。

function hide_fields_nonusers(){
if( $role == 'subscriber' ) {    ?>
<style type="text/css">
    .user-area .user-profile-dropdown{
        display: none !important;
    }
</style>
}
add_action('admin_head', 'hide_fields_nonusers');

我想知道我们在表格中有多少'先生',并尝试了以下内容:

SALUTATION
Dear Mr Smith
Dear Mrs Bloggs
Dear Mr Jefferson
Dear Prof Jenkins
Dear Mr Klein
Dear Mr Smith

我期待得到这样的结果:

select 
count(case when salutation like 'Dear Mr %' then 1 else 0 end) as "CountColumn"
from CLIENTS
GROUP BY salutation

相反,我得到:

CountColumn
3

它正在计算“亲爱的史密斯先生”的每一个例子,而不仅仅是“亲爱的先生”。我无法弄清楚如何实现这一点,我认为group by子句会将所有结果组合在一起吗?

6 个答案:

答案 0 :(得分:3)

Count会将任何值视为可数值,因此1&amp; 0将被视为相同。 NULL不是可数值,可用于代替0来计算该记录。

对称呼进行分组将重置每次不同称呼的计数。亲爱的史密斯先生两次,所有其他记录只出现一次,这就是你在观察结果中得到的结果。

根据您所希望的结果,您似乎想要从亲爱的先生开始计算不同的称呼。

select count(distinct salutation)
from CLIENTS
where salutation like 'Dear Mr %'

答案 1 :(得分:2)

我想你只是用它。

select 
count(distinct salutation) as "CountColumn"
from CLIENTS
where salutation like 'Dear Mr %'

SQLFiddle

答案 2 :(得分:1)

你也可以这样做

select count( Distinct salutation)  from @table where  SALUTATION like 'Dear Mr %'

示例数据

declare @table table (
SALUTATION varchar(255))
insert into @table( SALUTATION)
select 'Dear Mr Smith'
union all
select 'Dear Mrs Bloggs'
union all
select 'Dear Mr Jefferson'
union all
select 'Dear Prof Jenkins'
union all
select 'Dear Mr Klein'
union all
select 'Dear Mr Smith'

使用子查询

select count(*) Countcolumn
from 
(
select distinct * from @table where  SALUTATION like 'Dear Mr %'
) x

答案 3 :(得分:0)

您之所以得到这个,是因为您正在使用GROUP BY语句,那么该查询将返回您对每个案例所拥有多少“亲爱的先生”。 2&#39;亲爱的史密斯先生&#39; 1&#39;亲爱的杰斐逊先生 等等... 如果你想得到“亲爱的先生%&#39;您拥有的注册表,只需要删除GROUP BY语句。

查询将如下:

select 
count(case when salutation like 'Dear Mr %' then 1 end) as "CountColumn"
from CLIENTS

如果你不想考虑重复的登记册......

select 
count(case when C.salutation like 'Dear Mr %' then 1 end) as "CountColumn"
from (select distinct salutation from CLIENTS) C

答案 4 :(得分:0)

你得到了多个结果,因为你是通过称呼进行分组。只要称呼不同,它就会创建一个新组并计算该组的结果。

此外,您希望使用和Case而不是Count,因为Count将任何结果视为1并将所有结果相加。切换到Sum(Case When)将导致:

select 
sum(case when salutation like 'Dear Mr %' then 1 else 0 end) as CountColumn
from CLIENTS
GROUP BY salutation

将导致:

CountColumn
2
0
1
0
1

为了更接近所需的结果,您可以使用此子查询并将CountColumn结果相加。

select sum(CountColumn) as CountColumn
from
(
    select 
    sum(case when salutation like 'Dear Mr %' then 1 else 0 end) as CountColumn
    from CLIENTS
    GROUP BY salutation
) a

但这将总结“亲爱的先生%”的所有例子,并将两次亲爱的史密斯先生。结果将是

CountColumn
4

如果您希望“亲爱的先生%”的每个独特实例,您可以将内部查询的所有结果转换为1,当它们非零时。

select sum(case when CountColumn>0 then 1 else 0 end) as CountColumn
from
(
    select 
    sum(case when salutation like 'Dear Mr %' then 1 else 0 end) as CountColumn
    from CLIENTS
    GROUP BY salutation
) a

在我写这篇文章时,我推荐的答案由@ user9331264和@WesH发布,删除Where表达式中的所有示例并计算唯一结果。

答案 5 :(得分:0)

如果您需要其他列,您可以使用简单的SUM()或子查询和窗口函数执行您要执行的操作。

SQL Fiddle

MS SQL Server 2017架构设置

CREATE TABLE t (SALUTATION varchar(100), SomethingElse int) ;
INSERT INTO t (SALUTATION, SomethingElse)
VALUES 
    ('Dear Mr Smith', 1)
  , ('Dear Mrs Bloggs', 1)
  , ('Dear Mr Jefferson', 3)
  , ('Dear Prof Jenkins', 4)
  , ('Dear Mr Klein', 2)
  , ('Dear Mr Smith', 1)
;

简单求和()

SELECT 
  SUM(CASE WHEN SALUTATION LIKE 'Dear Mr %' THEN 1 ELSE 0 END) as CountColumn
FROM t

<强> Results

| CountColumn |
|-------------|
|           4 |

子查询和窗口函数

/* If SELECTing another column */
SELECT s1.SomethingElse
  , sum(s1.SalCount) OVER () AS CountColumn
FROM (
    SELECT t.SomethingElse
      , (CASE WHEN t.SALUTATION LIKE 'Dear Mr %' THEN 1 ELSE 0 END) as SalCount
    FROM t
) s1

<强> Results

| SomethingElse | CountColumn |
|---------------|-------------|
|             1 |           4 |
|             1 |           4 |
|             3 |           4 |
|             4 |           4 |
|             2 |           4 |
|             1 |           4 |