对于布尔字段,使用0计数(*)

时间:2010-07-27 06:51:53

标签: sql mysql count

假设我在数据库表中有一个布尔字段,我想知道有多少是1,有多少是0.目前我在做:

SELECT  'yes' AS result, COUNT( * ) AS num
FROM  `table` 
WHERE field = 1

UNION 

SELECT  'no' AS result, COUNT( * ) AS num
FROM  `table` 
WHERE field =  0;

是否有更简单的方法来获得结果,即使没有错误的值,我仍然会得到:

----------
|yes | 3 |
|no  | 0 |
----------

5 个答案:

答案 0 :(得分:4)

一种方法是将外连接到查找表。因此,创建一个将字段值映射到名称的查找表:

create table field_lookup (
    field int,
    description varchar(3)
)

并填充

insert into field_lookup values (0, 'no')
insert into field_lookup values (1, 'yes')

现在下一位取决于您的SQL供应商,以下是一些Sybase(或SQL Server)特定位(外部连接语法和isnull将空值转换为零):

select description, isnull(num,0)
from (select field, count(*) num from `table` group by field) d, field_lookup  fl
where d.field =* fl.field

答案 1 :(得分:3)

你走在正确的轨道上,但第一个答案是不正确的。这是一个解决方案,即使表中没有“否”,也会给出“是”和“否”:

SELECT 'Yes', (SELECT COUNT(*) FROM Tablename WHERE Field <> 0)
UNION ALL
SELECT 'No', (SELECT COUNT(*) FROM tablename WHERE Field = 0)

请注意,我已选中是&lt;&gt; 0因为某些使用SQL Server作为后端服务器的前端系统使用-1和1作为是。

此致 Arild

答案 2 :(得分:2)

这将产生两列:

SELECT SUM(field) AS yes, COUNT(*) - SUM(field) AS no FROM table

答案 3 :(得分:1)

因为没有任何现有的false值,如果你想看到它的汇总值 - 你需要LEFT JOIN到表或派生表/内联视图。假设没有TYPE_CODES表来查找值,请使用:

   SELECT x.desc_value AS result,
               COALESCE(COUNT(t.field), 0) AS num
     FROM (SELECT 1 AS value, 'yes' AS desc_value
                UNION ALL
                SELECT 2, 'no') x
LEFT JOIN TABLE t ON t.field = x.value
   GROUP BY x.desc_value

答案 4 :(得分:0)

SELECT COUNT(*) count, field FROM table GROUP BY field;

输出格式不完全相同,但是你得到的是数据

如果其中一个没有,那么你将无法获得那些行,但这应该很容易在你的代码中检查。