Leo
Leo

Reputation: 123

select case when not working as expected

I'm trying to understand how this works but can't figure it out yet.

I have made this simple uery to test the case-when-then-end clause...

  SELECT case when quantity > 3
              then count(*) end the_count_a,
         case when quantity <= 3
              then count(*) end the_count_b
    FROM STOCK

my stock table has 30 items with different quantities, only 10 items have quantity over 3 but this is always returning 30.... WHY? I think it should be returning two columns with values: 10 and 20

Any help will be appreciated! Thx, Leo

Upvotes: 2

Views: 513

Answers (3)

Adriano Carneiro
Adriano Carneiro

Reputation: 58615

SELECT 
       count(case when quantity > 3 then 1 else null end) end the_count_a,
       count(case when quantity <= 3 then 1 else null end) end the_count_b
FROM STOCK

Upvotes: 1

Michael Berkowski
Michael Berkowski

Reputation: 270617

The aggregate function COUNT() in absense of a GROUP BY will return all rows in the table which have not been filtered by a WHERE clause. In your case, what you actually need are two subselects or a UNION, depending if you want columns or rows back:

/* Return columns with subselects */
SELECT
  (SELECT COUNT(*) FROM STOCK WHERE quantity > 3) AS the_count_a
  (SELECT COUNT(*) FROM STOCK WHERE quantity <= 3) AS the_count_b

MySQL is lenient about the presence of a FROM clause, so it can be omitted from the outer query.

/* Return rows instead of columns with UNION */
SELECT 
  COUNT(*) AS the_count,
  'the_count_a'
FROM STOCK WHERE quantity > 3
UNION ALL
SELECT 
  COUNT(*) AS the_count,
  'the_count_b'
FROM STOCK WHERE quantity <= 30

Upvotes: 0

mellamokb
mellamokb

Reputation: 56769

The value of count(*) means the count of all records (in the current group), regardless of where it is placed. If you want to count records that match a condition, you need to invert your case statement:

select count(case when quantity > 3 then 1 end) the_count_a,
       count(case when quantity <= 3 then 1 end) the_count_b
  from stock

Upvotes: 4

Related Questions