我有一个包含 5 个字段的表。每个字段可以存储一个从 1 到 59 的数字。
与 Excel 中的 countif 类似,我如何计算 1 - 59 中的数字在所有 5 个字段中出现的次数?
以下是所有五个字段中数字 1 的出现次数的示例:
SELECT SUM(pick_1 = 1 OR pick_2 = 1 OR pick_3 = 1 OR pick_4 = 1 OR pick_5 = 1) AS total_count_1
FROM tbldraw
希望我是有道理的。
我有一个包含 5 个字段的表。每个字段可以存储一个从 1 到 59 的数字。
与 Excel 中的 countif 类似,我如何计算 1 - 59 中的数字在所有 5 个字段中出现的次数?
以下是所有五个字段中数字 1 的出现次数的示例:
SELECT SUM(pick_1 = 1 OR pick_2 = 1 OR pick_3 = 1 OR pick_4 = 1 OR pick_5 = 1) AS total_count_1
FROM tbldraw
希望我是有道理的。
这里有一个有解决方案的答案。我认为这只是一种变体。
Step1:创建一个数字表(1个字段,称为id,59条记录(值1 -59))
第2步:
SELECT numbers_table.number as number
, COUNT(tbldraw.pk_record)
FROM numbers_table
LEFT JOIN tbldraw
ON numbers_table.number = tbldraw.pick_1
OR numbers_table.number = tbldraw.pick_2
OR numbers_table.number = tbldraw.pick_3
OR numbers_table.number = tbldraw.pick_4
OR numbers_table.number = tbldraw.pick_5
GROUP BY number
ORDER BY number
两步过程怎么样?假设一个名为 的表summary_table ( int id, int ttl)
,对于您关心的每个数字...
insert into summary_table values (1,
(select count(*)
from table
where field1 = 1 or field2 = 1 or field3 = 1 or field4 = 1 or field5 = 1))
这样做 59 次,每个值一次。在大多数情况下,您可以使用循环。然后你可以从 summary_table 中选择
select *
from summary_table
order by id
这样就可以了。对于那些知道正在使用什么数据库的人,我将这个 SQL 的介绍留在了一个存储过程中。
如果前面的运算符用于所有参数,则ALL()
返回的函数使查询特别优雅和简洁。true
true
要找到特定数字(例如 3)的计数:
select count(*)
from tbldraw
where 3 = all (pick_1, pick_2, pick_3, pick_4, pick_5)
要查找所有此类数字的计数:
select pick_1, count(*)
from tbldraw
where pick_1 = all (pick_2, pick_3, pick_4, pick_5)
group by pick_1