SQL计数出现在一个包含多列的表中的每个记录(整数)

时间:2017-11-29 02:51:32

标签: java mysql sql count distinct

我正在研究一种使用SQL和JAVA的算法,涉及大数据集。 在SQL中我有一个包含所有数据的表,我希望在将它加载到JAVA之前尽可能多地使用SQL查询。

我生成随机数据集(在Java中),仅由1到40001之间的整数组成,然后将它们插入到MySQL表中。 行可以具有不同的长度,最多30个项目/记录(这包括ID)。所以通常列的数量是30(所以COL1,COL2,COL3,...... COL30),但这个数量在某些时候也是随机的

我想要做的是计算表/数据集中每个不同项的出现次数,并将它们放入带有计数的新表中。然而这很棘手,因为我想在整个表中计算它,而不仅仅是一列。我该怎么做?

指定:

以此表为例(与我常用的表相比,这是一个非常小的表):

ID | COL1 | COL2 | COL3 | COL4 | COL5 |
---------------------------------------
1  |   8  |  35  |  42  |  12  |  27  |
2  |  22  |  42  |  35  |  8   | NULL |
3  |  18  |  22  |   8  | NULL | NULL |
4  |  42  |  12  |  27  |  35  |  8   |
5  |  18  |  27  |  12  |  22  | NULL |

我想从这个表中提取的是:

Item | Count
-------------
8    |  3
35   |  3
40   |  1
12   |  3
27   |  3
22   |  3
42   |  2 
43   |  1
18   |  2

如果项目有所帮助,那么项目也不能多次出现在同一行中。

任何人都可以帮助我吗?或者它只是不能在SQL中完成?在性能方面,在JAVA中这样做会更好吗?

提前致谢!

1 个答案:

答案 0 :(得分:4)

您可以通过取消隐藏数据然后聚合来执行此操作:

select col, count(*)
from (select col1 as col from t union all
      select col2 from t union all
      . . . 
      select col30 from t
     ) t
group by col;

如果您没有已知的列集,则需要使用动态SQL。

相关问题