431

I can select all the distinct values in a column in the following ways:

  • SELECT DISTINCT column_name FROM table_name;
  • SELECT column_name FROM table_name GROUP BY column_name;

But how do I get the row count from that query? Is a subquery required?

Christian Oudard
  • 48,140
  • 25
  • 66
  • 69

14 Answers14

729

You can use the DISTINCT keyword within the COUNT aggregate function:

SELECT COUNT(DISTINCT column_name) AS some_alias FROM table_name

This will count only the distinct values for that column.

rstackhouse
  • 2,238
  • 24
  • 28
Noah Goodrich
  • 24,875
  • 14
  • 66
  • 96
237

This will give you BOTH the distinct column values and the count of each value. I usually find that I want to know both pieces of information.

SELECT [columnName], count([columnName]) AS CountOf
FROM [tableName]
GROUP BY [columnName]
Crayons
  • 1,906
  • 1
  • 14
  • 35
Paul James
  • 2,419
  • 1
  • 12
  • 2
37

An sql sum of column_name's unique values and sorted by the frequency:

SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name ORDER BY 2 DESC;
xchiltonx
  • 1,946
  • 3
  • 20
  • 18
31

Be aware that Count() ignores null values, so if you need to allow for null as its own distinct value you can do something tricky like:

select count(distinct my_col)
       + count(distinct Case when my_col is null then 1 else null end)
from my_table
/
David Aldridge
  • 51,479
  • 8
  • 68
  • 96
15
SELECT COUNT(DISTINCT column_name) FROM table as column_name_count;

you've got to count that distinct col, then give it an alias.

Pete Karl II
  • 4,060
  • 3
  • 21
  • 27
14
select count(*) from 
(
SELECT distinct column1,column2,column3,column4 FROM abcd
) T

This will give count of distinct group of columns.

gipinani
  • 14,038
  • 12
  • 56
  • 85
12
select Count(distinct columnName) as columnNameCount from tableName 
gipinani
  • 14,038
  • 12
  • 56
  • 85
Wayne
  • 38,646
  • 4
  • 37
  • 49
1

Using following SQL we can get the distinct column value count in Oracle 11g.

select count(distinct(Column_Name)) from TableName
Asclepius
  • 57,944
  • 17
  • 167
  • 143
Nilesh Shinde
  • 457
  • 5
  • 10
1

After MS SQL Server 2012, you can use window function too.

SELECT column_name, COUNT(column_name) OVER (PARTITION BY column_name) 
FROM table_name
GROUP BY column_name
Asclepius
  • 57,944
  • 17
  • 167
  • 143
Alper
  • 51
  • 2
  • 5
1

To do this in Presto using OVER:

SELECT DISTINCT my_col,
                count(*) OVER (PARTITION BY my_col
                               ORDER BY my_col) AS num_rows
FROM my_tbl

Using this OVER based approach is of course optional. In the above SQL, I found specifying DISTINCT and ORDER BY to be necessary.

Caution: As per the docs, using GROUP BY may be more efficient.

Asclepius
  • 57,944
  • 17
  • 167
  • 143
0
select count(distinct(column_name)) AS columndatacount from table_name where somecondition=true

You can use this query, to count different/distinct data.

Asclepius
  • 57,944
  • 17
  • 167
  • 143
Nitika Chopra
  • 1,281
  • 17
  • 22
0

Without using DISTINCT this is how we could do it-

SELECT COUNT(C)
FROM (SELECT COUNT(column_name) as C
FROM table_name
GROUP BY column_name)
Deva44
  • 93
  • 2
  • 9
0

You can do this.

Select distinct PRODUCT_NAME_X 
,count (Product_name) products_# 
from TableX
Group by PRODUCT_NAME

It will return

PRODUCT_NAME    products
XXXXXXXXXX      4760
Fildor
  • 14,510
  • 4
  • 35
  • 67
Darryl
  • 1
-10

Count(distinct({fieldname})) is redundant

Simply Count({fieldname}) gives you all the distinct values in that table. It will not (as many presume) just give you the Count of the table [i.e. NOT the same as Count(*) from table]

  • 3
    No, this is *not* correct. `count(field)` returns the number of lines where `field` is `not null`. – Antti29 Mar 26 '15 at 07:22