【问题标题】:How to find out count of unique values for each column of a table如何找出表的每一列的唯一值计数
【发布时间】:2015-09-19 09:01:21
【问题描述】:

我想计算下表中每一列的唯一值。对于每个唯一值,输出应该有 1 行,列数与起始表相同,每个列都有该唯一值的计数:

表名:- 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     |
+---------+---------+---------+---------+---------+

预期输出:

+---------+---------+---------+---------+---------+---------+
|         | 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    |
+---------+---------+---------+---------+---------+---------+

【问题讨论】:

  • 请详细说明您要输出的内容。
  • 我有值的表.. 所以首先我想从所有列中找到唯一值。然后使用该值,我希望计算每个值。示例:- car 是表中的不同值,然后“car”的计数在第 1 列中为 1,在第 2 列中为 0 等...
  • 您认为哪些值在您的样本表中是独一无二的?铅笔?
  • mysql 中的不同值,如汽车、火车、飞机、节奏、笔记本电脑、自行车、钢笔、铅笔、书等
  • 独特性并不明显。唯一值的计数为 1,否则它不是唯一的。不同的值可以被视为“相等值的组”

标签: mysql count


【解决方案1】:

我希望,这就是你最终要寻找的东西。 一切顺利:)

SQL Fiddle

MySQL 5.5 架构设置

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'); 

查询 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 |

【讨论】:

    【解决方案2】:

    这是你要找的吗?

    SQL Fiddle

    MySQL 5.5 架构设置

    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'); 
    

    查询 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 |
    

    【讨论】:

    • 我想在所有五列中计数而不是在单个计数中(*)
    • 预期格式如下:- 不同的值(计数)column1(计数)column2(计数)(计数)column3(计数)column4(计数)column5
    【解决方案3】:

    按照@fthiella 的逻辑,这里就是答案,我相信这就是你真正想要的 :)

    SQL Fiddle

    MySQL 5.5 架构设置

    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'); 
    

    查询 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 |
    

    【讨论】:

    • 我想要 6 列输出..你能帮帮我吗
    【解决方案4】:

    鉴于上表并假设,您想找到 column1 的不同值,这是一个起点:

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

    sqlfiddle here

    所有列和一个联合:

    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
    

    sqlfiddle

    【讨论】:

      【解决方案5】:

      您的表格看起来没有标准化,所以我认为您应该使用更好的结构,但没有任何上下文我不能建议您如何改进它。要解决您的问题,您可以使用一些 UNION ALL 查询,然后使用 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
      

      如果你想在列中包含所有值,那么你可以使用这个:

      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
      

      【讨论】:

      • @user3074158 请看看我更新的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多