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 :)
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?
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 :)
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.