mysql计数数字显示数
我有一列包含0-9之间的单个数字。 我需要知道每个数字出现多少次。 i、 e 0-4次,1-5次等等 我有6列要计算,所以我不想执行9*6查询,如果可能的话,用更少的时间 编辑: 我需要知道第1列出现了多少次,第2列出现了多少次,第3列出现了多少次。 这适用于所有数字 谢谢,mysql计数数字显示数,mysql,sql,Mysql,Sql,我有一列包含0-9之间的单个数字。 我需要知道每个数字出现多少次。 i、 e 0-4次,1-5次等等 我有6列要计算,所以我不想执行9*6查询,如果可能的话,用更少的时间 编辑: 我需要知道第1列出现了多少次,第2列出现了多少次,第3列出现了多少次。 这适用于所有数字 谢谢, Danny假设你有这组记录 ╔══════╦══════╦══════╦══════╦══════╦══════╗ ║ COL1 ║ COL2 ║ COL3 ║ COL4 ║ COL5 ║ COL6 ║ ╠══════╬═
Danny假设你有这组记录
╔══════╦══════╦══════╦══════╦══════╦══════╗
║ COL1 ║ COL2 ║ COL3 ║ COL4 ║ COL5 ║ COL6 ║
╠══════╬══════╬══════╬══════╬══════╬══════╣
║ 1 ║ 6 ║ 3 ║ 1 ║ 2 ║ 2 ║
║ 2 ║ 7 ║ 3 ║ 8 ║ 3 ║ 9 ║
║ 3 ║ 8 ║ 3 ║ 8 ║ 8 ║ 9 ║
║ 4 ║ 9 ║ 2 ║ 7 ║ 1 ║ 1 ║
║ 5 ║ 0 ║ 1 ║ 3 ║ 1 ║ 6 ║
╚══════╩══════╩══════╩══════╩══════╩══════╝
质疑
╔═════╦══════╦══════╦══════╦══════╦══════╦══════╗
║ VAL ║ COL1 ║ COL2 ║ COL3 ║ COL4 ║ COL5 ║ COL6 ║
╠═════╬══════╬══════╬══════╬══════╬══════╬══════╣
║ 0 ║ 0 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║
║ 1 ║ 1 ║ 0 ║ 1 ║ 1 ║ 2 ║ 1 ║
║ 2 ║ 1 ║ 0 ║ 1 ║ 0 ║ 1 ║ 1 ║
║ 3 ║ 1 ║ 0 ║ 3 ║ 1 ║ 1 ║ 0 ║
║ 4 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║
║ 5 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║
║ 6 ║ 0 ║ 1 ║ 0 ║ 0 ║ 0 ║ 1 ║
║ 7 ║ 0 ║ 1 ║ 0 ║ 1 ║ 0 ║ 0 ║
║ 8 ║ 0 ║ 1 ║ 0 ║ 2 ║ 1 ║ 0 ║
║ 9 ║ 0 ║ 1 ║ 0 ║ 0 ║ 0 ║ 2 ║
╚═════╩══════╩══════╩══════╩══════╩══════╩══════╝
你可能应该考虑规范你的数据,这样你就可以将你的值存储在一个单独的表中:FK标识你现有的记录,关注列(1-6)和包含在其中的值。example@eggyal你为什么删除你的答案?(即自然连接的危险:)工作!我无法理解你是如何做到这么快的……但它正在工作:)你能解释一下这句话吗:“MAX(当colName='num1'然后TotalCount ELSE 0 END)num1,”Mysql不像其他任何支持它的RDBMS那样有一个
PIVOT()
函数。因此,在本例中,它基本上需要使用聚合函数,例如MAX()
。CASE
测试子查询中生成的列的值。当结果为true时,列上给出的值是子查询中的聚合结果,否则0
。因此,为了避免重复使用val
的值,我们使用MAX()
来聚合记录。
SELECT a.val,
MAX(CASE WHEN colName = 'col1' THEN TotalCount ELSE 0 END) col1,
MAX(CASE WHEN colName = 'col2' THEN TotalCount ELSE 0 END) col2,
MAX(CASE WHEN colName = 'col3' THEN TotalCount ELSE 0 END) col3,
MAX(CASE WHEN colName = 'col4' THEN TotalCount ELSE 0 END) col4,
MAX(CASE WHEN colName = 'col5' THEN TotalCount ELSE 0 END) col5,
MAX(CASE WHEN colName = 'col6' THEN TotalCount ELSE 0 END) col6
FROM
(
SELECT 0 val UNION ALL
SELECT 1 UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6 UNION ALL
SELECT 7 UNION ALL
SELECT 8 UNION ALL
SELECT 9
) a
LEFT JOIN
(
SELECT col1 val, COUNT(*) TotalCount, 'col1' colname
FROM tableName
GROUP BY col1
UNION ALL
SELECT col2 val, COUNT(*), 'col2' colname
FROM tableName
GROUP BY col2
UNION ALL
SELECT col3 val, COUNT(*), 'col3' colname
FROM tableName
GROUP BY col3
UNION ALL
SELECT col4 val, COUNT(*), 'col4' colname
FROM tableName
GROUP BY col4
UNION ALL
SELECT col5 val, COUNT(*), 'col5' colname
FROM tableName
GROUP BY col5
UNION ALL
SELECT col6 val, COUNT(*), 'col6' colname
FROM tableName
GROUP BY col6
) b ON a.val = b.val
GROUP By a.val
╔═════╦══════╦══════╦══════╦══════╦══════╦══════╗
║ VAL ║ COL1 ║ COL2 ║ COL3 ║ COL4 ║ COL5 ║ COL6 ║
╠═════╬══════╬══════╬══════╬══════╬══════╬══════╣
║ 0 ║ 0 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║
║ 1 ║ 1 ║ 0 ║ 1 ║ 1 ║ 2 ║ 1 ║
║ 2 ║ 1 ║ 0 ║ 1 ║ 0 ║ 1 ║ 1 ║
║ 3 ║ 1 ║ 0 ║ 3 ║ 1 ║ 1 ║ 0 ║
║ 4 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║
║ 5 ║ 1 ║ 0 ║ 0 ║ 0 ║ 0 ║ 0 ║
║ 6 ║ 0 ║ 1 ║ 0 ║ 0 ║ 0 ║ 1 ║
║ 7 ║ 0 ║ 1 ║ 0 ║ 1 ║ 0 ║ 0 ║
║ 8 ║ 0 ║ 1 ║ 0 ║ 2 ║ 1 ║ 0 ║
║ 9 ║ 0 ║ 1 ║ 0 ║ 0 ║ 0 ║ 2 ║
╚═════╩══════╩══════╩══════╩══════╩══════╩══════╝