10

我最近设置了一个 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(*) 语句之外,还有什么方法可以做到这一点?

编辑:

如果有帮助,列是“艺术家 1”、“艺术家 2”、....“艺术家 88”、“性别”、“年龄”、“城市”、“州”。正如我试图在下面解释的那样,我希望我能够做类似的事情:

select sum(EACH_COLUMN) from POLLDATA where gender='Male', city='New York City';

(显然 EACH_COLUMN 是假的)

4

6 回答 6

36
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 
于 2013-11-11T18:17:13.883 回答
7

如果您只是在寻找列中 1 的绝对数量,您可以尝试……</p>

select sum(col1), sum(col2), sum(col3) from POLLDATA
于 2013-11-11T18:15:20.780 回答
1

按 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

于 2013-11-11T18:31:03.547 回答
1

一个稍微紧凑的符号是SUM( IF( expression ) ).

对于提问者示例,这可能类似于:

select
  count(*) as total,
  sum(if(gender = 'MALE', 1, 0)) as males,
  sum(if(gender = 'FEMALE', 1, 0)) as females,
  sum(if(city = 'New York City', 1, 0)) as newYorkResidents
from POLLDATA;

示例结果:

+-------+-------+---------+------------------+
| total | males | females | newYorkResidents |
+-------+-------+---------+------------------+
|    42 |    23 |      19 |               42 |
+-------+-------+---------+------------------+
于 2021-09-20T19:02:10.323 回答
0

为什么不存储实际数字 1 或 0 而不是字符串。

然后你可以使用 sql SUM 函数。

于 2013-11-11T18:17:02.120 回答
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;

在此处查看小提琴。

于 2013-11-11T18:55:47.783 回答