简体   繁体   中英

How to find out count of unique values for each column of a table

I want to get a count of unique values for every column in the table below. The output should have 1 row for each unique value and the same number of columns as the starting table, each of which has a count of that unique value:

table Name :- mytable

+---------+---------+---------+---------+---------+
| column1 | column2 | column3 | column4 | column5 |
+---------+---------+---------+---------+---------+
| car     | train   | plane   | tempo   | laptop  |
| bike    | pen     | car     | Null    | pencil  |
| tempo   | book    | car     | laptop  | book    |
| Null    | bike    | tempo   | book    | pen     |
+---------+---------+---------+---------+---------+

Expected output:

+---------+---------+---------+---------+---------+---------+
|         | column1 | column2 | column3 | column4 | column5 |
+---------+---------+---------+---------+---------+---------+
| car     |    1    |    0    |    2    |    0    |    0    |
| bike    |    1    |    1    |    0    |    0    |    0    |
| tempo   |    1    |    0    |    1    |    1    |    0    |
| train   |    0    |    1    |    0    |    0    |    0    |
| pen     |    0    |    1    |    0    |    0    |    1    |
| book    |    0    |    1    |    0    |    1    |    1    |
| plane   |    0    |    0    |    1    |    0    |    0    |
| laptop  |    0    |    0    |    0    |    1    |    1    |
| pencil  |    0    |    0    |    0    |    0    |    1    |
| (null)  |    1    |    0    |    0    |    1    |    0    |
+---------+---------+---------+---------+---------+---------+

I hope, this is what you are finally look for. all the best :)

SQL Fiddle

MySQL 5.5 Schema Setup :

CREATE TABLE table_name
(
  column_1 VARCHAR (20),
  column_2 VARCHAR (20),
  column_3 VARCHAR (20),
  column_4 VARCHAR (20),
  column_5 VARCHAR (20));

 insert into table_name values
('car','train','plane','tempo','laptop'); 
 insert into table_name values
('bike','pen','car',Null,'pencil'); 
 insert into table_name values
('tempo','book','car','laptop','book'); 
 insert into table_name values
(Null,'bike','tempo','book','pen'); 

Query 1 :

SELECT
     valuex,
     SUM(IFNULL(ELT(FIELD(Columnx, 'Column_1'), 1), 0)) as Column_1,
     SUM(IFNULL(ELT(FIELD(Columnx, 'Column_2'), 1), 0)) as Column_2,
     SUM(IFNULL(ELT(FIELD(Columnx, 'Column_3'), 1), 0)) as Column_3,
     SUM(IFNULL(ELT(FIELD(Columnx, 'Column_4'), 1), 0)) as Column_4,
     SUM(IFNULL(ELT(FIELD(Columnx, 'Column_5'), 1), 0)) as Column_5
FROM (
  SELECT column_1 AS valuex, "Column_1" AS Columnx
  FROM table_name
  UNION ALL
  SELECT column_2 AS valuex, "Column_2" AS Columnx
  FROM table_name
  UNION ALL
  SELECT column_3 AS valuex, "Column_3" AS Columnx
  FROM table_name
  UNION ALL
  SELECT column_4 AS valuex, "Column_4" AS Columnx
  FROM table_name
  UNION ALL
  SELECT column_5 AS valuex, "Column_5" AS Columnx
  FROM table_name
) s
group by valuex

Results :

|--------|----------|----------|----------|----------|----------|
| valuex | Column_1 | Column_2 | Column_3 | Column_4 | Column_5 |
|--------|----------|----------|----------|----------|----------|
| (null) |        1 |        0 |        0 |        1 |        0 |
|   bike |        1 |        1 |        0 |        0 |        0 |
|   book |        0 |        1 |        0 |        1 |        1 |
|    car |        1 |        0 |        2 |        0 |        0 |
| laptop |        0 |        0 |        0 |        1 |        1 |
|    pen |        0 |        1 |        0 |        0 |        1 |
| pencil |        0 |        0 |        0 |        0 |        1 |
|  plane |        0 |        0 |        1 |        0 |        0 |
|  tempo |        1 |        0 |        1 |        1 |        0 |
|  train |        0 |        1 |        0 |        0 |        0 |

Your table doesn't look normalized, so I think you should use a better structure, but without any context I cannot suggest you how to improve it. To solve your problem you could use some UNION ALL queries, and then a GROUP BY

SELECT value, column, COUNT(*)
FROM (
  SELECT column1 AS value, "Column1" AS Column
  FROM mytable
  UNION ALL
  SELECT column2 AS value, "Column2" AS Column
  FROM mytable
  UNION ALL
  SELECT column3 AS value, "Column3" AS Column
  FROM mytable
  UNION ALL
  SELECT column4 AS value, "Column4" AS Column
  FROM mytable
) s
GROUP BY value, column
ORDER BY value, column

if you want to have all values in columns, then you can use this:

SELECT
  value,
  MAX(CASE WHEN column='Column1' THEN cnt END AS cnt_1,
  MAX(CASE WHEN column='Column2' THEN cnt END AS cnt_2,
  MAX(CASE WHEN column='Column3' THEN cnt END AS cnt_3,
  MAX(CASE WHEN column='Column4' THEN cnt END AS cnt_4
FROM (
  SELECT value, column, COUNT(*) AS cnt
  FROM (
    SELECT column1 AS value, "Column1" AS Column
    FROM mytable
    UNION ALL
    SELECT column2 AS value, "Column2" AS Column
    FROM mytable
    UNION ALL
    SELECT column3 AS value, "Column3" AS Column
    FROM mytable
    UNION ALL
    SELECT column4 AS value, "Column4" AS Column
    FROM mytable
  ) AS s
  GROUP BY value, column
  ORDER BY value, column
) AS s
GROUP BY value

Given the table above and assumed, you want to find the distinct values of column1 , here's a starting point:

SELECT column1, count(column1) FROM myTable GROUP BY column1

sqlfiddle here

All columns together with a union:

SELECT col, count(col) FROM (
  SELECT column1 as col FROM myTable  UNION ALL
  SELECT column2 as col FROM myTable  UNION ALL
  SELECT column3 as col FROM myTable  UNION ALL
  SELECT column4 as col FROM myTable  UNION ALL
  SELECT column5 as col FROM myTable  
) as x GROUP BY x.col

New sqlfiddle

Is this what you were looking for?

SQL Fiddle

MySQL 5.5 Schema Setup :

CREATE TABLE table_name
(
  column_1 VARCHAR (20),
  column_2 VARCHAR (20),
  column_3 VARCHAR (20),
  column_4 VARCHAR (20),
  column_5 VARCHAR (20));

 insert into table_name values
('car','train','plane','tempo','laptop'); 
 insert into table_name values
('bike','pen','car',Null,'pencil'); 
 insert into table_name values
('tempo','book','car','laptop','book'); 
 insert into table_name values
(Null,'bike','tempo','book','pen'); 

Query 1 :

select col, Count(*) from ( 
select distinct column_1 as col from table_name
union all
select distinct column_2 as col from table_name
union all
select distinct column_3 as col from table_name
union all
select distinct column_4 as col from table_name
union all
select distinct column_5 as col from table_name) as newTable
group by col

Results :

|    col | Count(*) |
|--------|----------|
| (null) |        2 |
|   bike |        2 |
|   book |        3 |
|    car |        2 |
| laptop |        2 |
|    pen |        2 |
| pencil |        1 |
|  plane |        1 |
|  tempo |        3 |
|  train |        1 |

As per @fthiella's logic here is the answer, and I am sure this is what you really wanted :)

SQL Fiddle

MySQL 5.5 Schema Setup :

CREATE TABLE table_name
(
  column_1 VARCHAR (20),
  column_2 VARCHAR (20),
  column_3 VARCHAR (20),
  column_4 VARCHAR (20),
  column_5 VARCHAR (20));

 insert into table_name values
('car','train','plane','tempo','laptop'); 
 insert into table_name values
('bike','pen','car',Null,'pencil'); 
 insert into table_name values
('tempo','book','car','laptop','book'); 
 insert into table_name values
(Null,'bike','tempo','book','pen'); 

Query 1 :

SELECT valueX, columnX, COUNT(*)
FROM (
  SELECT column_1 AS valuex, "Column_1" AS Columnx
  FROM table_name
  UNION ALL
  SELECT column_2 AS valuex, "Column_2" AS Columnx
  FROM table_name
  UNION ALL
  SELECT column_3 AS valuex, "Column_3" AS Columnx
  FROM table_name
  UNION ALL
  SELECT column_4 AS valuex, "Column_4" AS Columnx
  FROM table_name
) s
GROUP BY valuex, columnX
ORDER BY valuex, columnX

Results :

| valuex |  Columnx | COUNT(*) |
|--------|----------|----------|
| (null) | Column_1 |        1 |
| (null) | Column_4 |        1 |
|   bike | Column_1 |        1 |
|   bike | Column_2 |        1 |
|   book | Column_2 |        1 |
|   book | Column_4 |        1 |
|    car | Column_1 |        1 |
|    car | Column_3 |        2 |
| laptop | Column_4 |        1 |
|    pen | Column_2 |        1 |
|  plane | Column_3 |        1 |
|  tempo | Column_1 |        1 |
|  tempo | Column_3 |        1 |
|  tempo | Column_4 |        1 |
|  train | Column_2 |        1 |

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM