2010-07-26 130 views
5

我有一个允许空值的列表。如果该值为空,则不完整。我想计算完成的百分比。获取通过计算空值完成的列的百分比

这能在MySQL通过SQL完成,或者我应该得到的总条目,总空条目,并计算服务器上的百分比是多少?

无论哪种方式,我在我需要如何去分离VARIABLE_VALUE这样我就可以得到它的总成绩也总NULL结果很困惑。

SELECT 
    games.id 
FROM 
    games 
WHERE 
    games.category_id='10' AND games.variable_value IS NULL 

这给了我变量_值为NULL的所有游戏。我该如何扩展这个功能,让我获得TOTAL游戏或游戏NOT NULL?

表模式:

ID(int主自动Inc)的

CATEGORY_ID(INT)

VARIABLE_VALUE(TEXT允许Null默认:NULL)

+0

,你能不能给我们表模式? – JNK 2010-07-26 19:55:22

回答

11

当您使用 “计数”列名称不包含空值。因此,要获得计数或百分比不为空只是这样做......

SELECT 
    count(1) as TotalAll, 
    count(variable_value) as TotalNotNull, 
    count(1) - count(variable_value) as TotalNull, 
    100.0 * count(variable_value)/count(1) as PercentNotNull 
FROM 
    games 
WHERE 
    category_id = '10' 
+2

+1:这也是我的想法 - 计算列,将数量除以非空实例的数量。我在想'SUM(COALESCE(数值,0)/ COUNT(...)'自己... – 2010-07-26 20:01:39

+0

编辑:增加了其他的 “总” 选项 – 2010-07-26 20:08:19

5
SELECT 
    SUM(CASE WHEN G.variable_value IS NOT NULL THEN 1 ELSE 0 END)/COUNT(*) AS pct_complete 
FROM 
    Games G 
WHERE 
    G.category_id = '10' 

你可能需要做的SUM(),使你得到一个小数部分铸造。

+0

+1:见我对卡特的评论 – 2010-07-26 20:02:17

+0

是啊,我给了他+1我也喜欢聚合超过NULL可以导致更简洁的代码,但默认情况下,当我开始输入我去冗长的:) – 2010-07-26 20:04:20

2

来算的条目数量符合WHERE语句,使用COUNT(*)

SELECT COUNT(*) AS c FROM games WHERE games.variable_value IS NULL 

如果你想两行的总数和那些VARIABLE_VALUE是NULL在一条语句,尝试GROUP BY

SELECT COUNT(variable_value IS NULL) AS c, (variable_value IS NULL) AS isnull FROM games GROUP BY isnull 

返回类似

c | isnull 
============== 
12 | 1 
193 | 0 

==> 12项具有NULL该列,193没有带

==>比例:12 /(12 + 193)