2010-07-27 69 views
1

比方說,我有一個數據庫表中的布爾字段,我想了解有多少是1,多少0。目前我做了提示:COUNT(*)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 | 
---------- 

回答

1

因爲沒有任何現有的false值,所以如果您想查看其摘要值 - 您需要將LEFT JOIN添加到表或派生表/內聯視圖中。假設沒有TYPE_CODES表中查找的數值,使用:當不存在任何虛假值(如OP要求)

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 
+0

我是嘗試這個,但得到1,如果結果應該是0,因爲LEFT JOIN返回1行填充NULL的右側。 – 2010-07-27 07:30:53

+0

@Matt McCormick:已更新,現在試試 – 2010-07-27 07:34:03

+0

現在可以使用。謝謝! – 2010-07-27 07:40:00

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

不完全是相同的輸出格式,但它是相同的數據你 回來。

如果其中一個沒有,則不會返回該行,但應該很容易檢查代碼。

+1

將無法​​正常工作,但我會做到這一點的像真,假以同樣的方式 – knittl 2010-07-27 06:55:41

3

你是在正確的軌道上,但第一個答案是不正確的。這裏是給你Yes和No即使沒有在表中「否」的解決方案:

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

要知道,我已經籤是爲<> 0,因爲它使用SQL的前端系統服務器作爲後端服務器,使用-1和1。

問候 Arild

+0

類,文件未找到? :) – falstro 2010-07-27 07:19:38

+2

你想檢查'<> 0',但寫了'<> 1' ... – pascal 2010-07-27 07:34:09

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

有很多*不僅TSQL在那裏,但它** **難以置信** *舊* TSQL。這絕對不會在MySQL上運行,並且查找表的連接過於複雜 - 不需要派生表/內聯視圖,只要加入查找表就可以了...' – 2010-07-27 07:16:20

2

這將導致兩列:

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