2013-05-01 82 views
0

用於提取非空的所有列的計數的查詢;非空的所有列的計數

id | Col1 | Col2 | Col3 | Col4 | 
-------------------------------- 
1 | abc | --- | xyz | pqr | 
-------------------------------- 
2 | def | ghi | --- | pqr | 
-------------------------------- 
3 | --- | --- | hgy | --- | 
-------------------------------- 
4 | --- | jko |  | uyi | 
-------------------------------- 


SELECT COUNT(*) FROM table 1 WHERE Col1!='---' 

SELECT COUNT(*) FROM table 1 WHERE Col2!='---' 

SELECT COUNT(*) FROM table 1 WHERE Col3!='---' 

在一個單一的查詢

如何獲得的結果作爲

----------------------- 
Cnt1| Cnt2 |Cnt3| Cnt4| 
----------------------- 
2 | 2 | 2 | 3 | 
----------------------- 
+0

請清理這個問題的格式:http://stackoverflow.com/editing-help – 2013-05-01 05:48:04

回答

4

有趣的是:

select count(col1) cnt1, count(col2) cnt2, count(col3) cnt3, count(col4) cnt4 
from table1 
+0

可以請你檢查的問題顯然 我不需要列的計數。 我需要在哪裏條件不爲null的列數(null表示爲---) – 2013-05-01 06:02:13

+2

@NaveenKumar閱讀[手冊](http://dev.mysql.com/doc/refman/5.7/en/ group-by-functions.html#function_count):「返回行中expr的**非空**值數量的計數...」 – 2013-05-01 06:07:07

+0

查詢結果爲4 4 4 4 – 2013-05-01 06:18:38

0

試試這個:

with data as (
    select * 
    from (values 
     (null, null, null, null), 
     ( 1, null, null, null), 
     ( 2, 4, null, null), 
     ( 0, 5, 6, null) 
) data(col1,col2,col3,col4) 
) 
select 
    sum(case when col1 is null then 0 else 1 end), 
    sum(case when col2 is null then 0 else 1 end), 
    sum(case when col3 is null then 0 else 1 end), 
    sum(case when col4 is null then 0 else 1 end) 
from data 

這很好地產生:

----------- ----------- ----------- ----------- 
      3   2   1   0 
+0

選擇 總和(情況下,當COL1是空值,則0,否則,1)結束時, 總和(情況下,當COL2是空值,則0,否則,1)結束時, 總和(情況下,當COL3是空值,則0,否則,1)結束時, 總和(當col4爲空然後0 else 1結束) 從數據 完美地工作完成我的要求..謝謝 – 2013-05-01 06:37:43

+0

是的;其餘的正在構建樣本數據以進行測試。 – 2013-05-01 06:39:19

+0

這個問題被標記爲[tag:mysql],它不支持'WITH'語法。 – eggyal 2013-05-01 07:48:06

0

看起來你有 '---' 值,而不是空值。在這種情況下:

select count(nullif(col1,'---')) as cnt1, count(nullif(col2,'---')) as cnt2, count(nullif(col1,'---')) as cnt3, count(nullif(col1,'---')) as cnt4 from table1;