假设我在数据库表中有一个布尔字段,我想知道有多少是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 |
----------
答案 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;
输出格式不完全相同,但是你得到的是数据。
如果其中一个没有,那么你将无法获得那些行,但这应该很容易在你的代码中检查。