我最近设置了一个连接到填充了复选框的表单的MYSQL数据库。如果选中该复选框,则会在关联列中插入值“1”;否则,它将收到值'0'。
我想最终查看此表单中的聚合数据,并想知道是否有任何方法可以使用MYSQL为每列获取一个数字,该数字等于具有值的行数'1'。
我尝试过各种变体:
select count(*) from POLLDATA group by column_name
这是不成功的,我认为没有别的东西似乎有意义(诚然,我在SQL中并不是很有经验)。
我真的想避免:
select count(*) from POLLDATA where column_1='1'
每列(接近100列)。 除了为每列键入select count(*)语句之外,还有什么办法吗?
编辑:
如果有帮助,列为'artist1','artist2',....'artist88','gender','age','city','state'。当我试图在下面解释时,我希望我能够做到这样的事情:
select sum(EACH_COLUMN) from POLLDATA where gender='Male', city='New York City';
(显然EACH_COLUMN是假的)
答案 0 :(得分:23)
SELECT SUM(CASE
WHEN t.your_column = '1' THEN 1
ELSE 0
END) AS OneCount,
SUM(CASE
WHEN t.your_column='0' THEN 1
ELSE 0
END) AS ZeroCount
FROM YOUR_TABLE t
答案 1 :(得分:4)
如果您只想在列中查找1的绝对数字,您可以尝试...
select sum(col1), sum(col2), sum(col3) from POLLDATA
答案 2 :(得分:0)
而不是字符串为什么不存储实际数字,1或0。
然后你可以使用sql SUM函数。
答案 3 :(得分:0)
通过column_name从POLLDATA组中选择count(*)
我不认为你想要进行计数,因为这也会计算带有0的记录。
尝试
select column_naam,sum(column_name) from POLLDATA group by column_name
或
select column_naam,count(*) from POLLDATA
where column_name <> 0
group by column_name
只添加0
答案 4 :(得分:0)
当查询开始有点过于复杂时,可能是因为你应该再考虑一下你的数据库结构。但是如果你想保持你的表不变,你可以使用一个自动计算所有总和的预准备语句,而不指定每一列:
SELECT
CONCAT(
'SELECT ',
GROUP_CONCAT(CONCAT('SUM(', `column_name`, ') AS sum_', `column_name`)),
' FROM POLLDATA WHERE gender=? AND city=?')
FROM `information_schema`.`columns`
WHERE `table_schema`=DATABASE()
AND `table_name`='POLLDATA'
AND `column_name` LIKE 'artist%'
INTO @sql;
SET @gender := 'male';
SET @city := 'New York';
PREPARE stmt FROM @sql;
EXECUTE stmt USING @gender, @city;
请参阅小提琴here。