【问题标题】:Selecting distinct values from multiple column of a table with their count从表的多个列中选择不同的值及其计数
【发布时间】:2015-03-30 16:45:05
【问题描述】:

我想从同一个表的多个列中选择不同的值及其计数 例子

输出应该是这样的

【问题讨论】:

  • 您使用的是哪个数据库:MySQL; SQL 服务器;还是 MS Access?
  • 哪个数据库?你为什么需要这个?看起来像非聚类数据。
  • 欢迎来到 Stack Overflow。这个问题似乎离题了,因为它只是一个编程“规范”,没有证据表明您对该主题进行过任何研究或自己努力解决它。请edit您的问题显示[1]您搜索的主题,和/或[2]您尝试过的事情以及为什么它们不起作用。如果“您不知道从哪里开始”,请阅读有关 SQL 的书籍或做一些在线教程,当您有实际问题时再回来。

标签: mysql sql sql-server database ms-access


【解决方案1】:

由于 OP 在他的评论中说他使用 MYSQL,这应该可以工作

SELECT data,COUNT(data)
FROM  
(
   SELECT COL1 data
   FROM tableso
   UNION ALL
   SELECT COL2
   FROM tableso
   UNION ALL
   SELECT COL3
   FROM tableso
   UNION ALL
   SELECT COL4
   FROM tableso
   UNION ALL
   SELECT COL6
   FROM tableso
   UNION ALL
   SELECT COL7
   FROM tableso
) finaltable group by data;

SQL FIDDLE:http://sqlfiddle.com/#!2/1f8cf/10

我认为接受的答案不适用于 MYSQL

更新:

操作员改变了对数据库的看法(改为 MSSQL),并且接受的答案有两个 db 版本

【讨论】:

  • Distinct 这里不需要
  • 这是用于 sql server 的
【解决方案2】:

由于您也使用Sql Server,因此建议您这样做

使用Table valued constructor 将列转换为行,然后使用count name

这将避免多次表扫描。

SELECT name,
       [count]=Count(1)
FROM   yourtable
       CROSS apply (VALUES (col1),(COL2),(col3),(col4),(COL6),(col7)) cs (name)
GROUP  BY name

注意:这不适用于Mysql

SQLFIDDLE DEMO

【讨论】:

    【解决方案3】:

    获取所有列值到一行并找到计数

    SQL 服务器

    ;WITH CTE AS
    (
       SELECT COL1 Name
       FROM YOURTABLE
       UNION ALL
       SELECT COL2
       FROM YOURTABLE
       UNION ALL
       SELECT COL3
       FROM YOURTABLE
       UNION ALL
       SELECT COL4
       FROM YOURTABLE
       UNION ALL
       SELECT COL6
       FROM YOURTABLE
       UNION ALL
       SELECT COL7
       FROM YOURTABLE
    )
    SELECT DISTINCT Name,COUNT(Name) OVER(PARTITION BY Name) [COUNT]
    FROM CTE 
    

    MYSQL

    SELECT Name,COUNT(*) [COUNT]
    (
       SELECT COL1 Name
       FROM #TEMP
       UNION ALL
       SELECT COL2
       FROM #TEMP  
       UNION ALL
       SELECT COL3
       FROM #TEMP  
       UNION ALL
       SELECT COL4
       FROM #TEMP  
       UNION ALL
       SELECT COL6
       FROM #TEMP  
       UNION ALL
       SELECT COL7
       FROM #TEMP      
    )TAB   
    GROUP BY Name
    

    【讨论】:

    • 更好地使用 group bycountnameMysql 不支持 over 子句 +1。
    • 我刚刚在 sql server 中尝试了上述查询。它对我有用。谢谢你的回答
    • @VivekMaru - 来吧,至少标记你的问题是正确的。在 cmets 你说你正在使用Mysql。你在这里使用sql server
    • 完成 :) @NoDisplayName
    • 投反对票?为什么要投反对票?我为 SQl Server 和 MYSQL 添加了解决方案
    猜你喜欢
    • 2017-11-05
    • 2012-07-03
    • 1970-01-01
    • 2018-03-11
    • 2017-07-05
    • 2021-06-07
    • 2021-11-25
    • 2017-11-11
    • 2013-11-11
    相关资源
    最近更新 更多