May 9, 2024

I figured out a trick to get a count(*) to return 0 in a query in MS SQL Server.

Suppose I had a table called company like follows:

manager

employee

happy

1

a

n

1

b

n

2

c

y

2

d

n

3

e

y

3

f

y

I wanted to get a count of happy employees grouped by manager. At first, I tried:

SELECT manager, COUNT(*) as happy_count
FROM company
WHERE (happy = ‘y’)
GROUP BY manager

But, when I ran this, I got:

manager

happy_count

2

1

3

2

What happens is that the where clause doesn’t get anything for manager 1, so there’s no count for manager 1. What I want is a count of 0 for manager 1. I didn’t want to use a temporary table or a stored procedure. I figured there’s got to some easy way to do this.

Then I thought about this:

SELECT manager, SUM(CASE happy WHEN ‘y’ THEN 1 WHEN ‘n’ THEN 0 END) AS happy_count
FROM company
GROUP BY manager

manager

happy_count

1

0

2

1

3

2

Bingo! The trick is to use a sum statement in conjunction with a case.