2011-11-23 111 views
2

我不知道这是可能的,或者如果它是如何做到这一点 -SQL计数空字段

我有一个数据库中的以下数据 -

id  | improve | timeframe | criteria | impact 
-------+------------+-------------+-----------+--------- 
1  |   | Test  | Test | Test 
2  | Test |    | Test | 
3  |   | Test  |   |  
-------+------------+-------------+-----------+--------- 

忽略id列,如何使用SQL查询确定剩余12个非空的字段数?

我已经开始用 -

SELECT improve, timeframe, impact, criteria 
FROM data 
WHERE improve IS NOT NULL 
    AND timeframe IS NOT NULL 
    AND impact IS NOT NULL 
    AND criteria IS NOT NULL; 

这只返回的行数,即。 3.

任何想法?

谢谢。

+0

只是要清楚,你想获得的所有非空字段的总和。所以,'count(改进)哪里改进不是null +计数(时间框架)哪里时间帧不为空,等等,对吗? – abhinav

+0

是的没错,我需要所有非空字段的总和,对不起,如果不明确。 – Tom

+0

如何知道单列中的空行?谢谢 –

回答

6
SELECT count(improve) + count(timeframe) + count(impact) + count(criteria) FROM data 
+0

目前这返回所有字段,我在哪里检索所有非空字段的总和错误? – Tom

+2

@Tom,你试过这个查询吗?此外,你需要澄清你的意思是“非空”。在你的问题中,你谈到了“非空”,这是除了Oracle以外的大多数数据库的差异。该查询计算所有不为空的字段。 – Cito

+0

我正在使用phpmyadmin并将字段设置为Varchar默认NULL,但它仍显示所有字段的总和,无论它们是否为null。这听起来正确吗? – Tom

2

像这样的东西可以让你在正确的方向前进

SELECT 
SUM(CASE WHEN improve IS NULL THEN 0 ELSE 1 END + 
CASE WHEN timeframe IS NULL THEN 0 ELSE 1 END + 
CASE WHEN criteria IS NULL THEN 0 ELSE 1 END + 
CASE WHEN impact IS NULL THEN 0 ELSE 1 END) 
from 
data 
-2
SELECT Sum(case when improve is null then 0 else 1 end + 
case when timeframe is null then 0 else 1 end + 
case when impact is null then 0 else 1 end + 
case when criteria is null then 0 else 1 end) 
FROM data 
group by improve, timeframe, impact, criteria 
+1

你应该查看'COUNT'函数 –

0

如果您使用的SQL Server,使用DATALENGTH()。

SELECT improve, timeframe, impact, criteria 
FROM data 
WHERE DATALENGTH(improve) > 0 
AND DATALENGTH(timeframe) > 0 
AND DATALENGTH(impact) > 0 
AND DATALENGTH(criteria) >0; 

DATALENGTH以字节为单位返回字符串的长度,包括尾随空格。这听起来好像你没有空白字段,所以DATALENGTH完成这项工作。否则,你也可以使用LEN()来修剪任何尾随空格。

如果您使用的是MySQL,,您可以使用CHARACTER_LENGTH,它删除尾随空白处,然后给出您想要检查的字段的字符数。

0

尝试下面的代码

SELECT id, COUNT(improve) + COUNT(timeframe) + COUNT(impact) + COUNT(criteria) FROM data GROUP BY id;