2009-08-17 40 views
0

使用Access 2003如果值不为null,如何获得行计数?

EmpID Value1 Value2 

001 100 
001  300 
001 200 400 
001 300 
001  250 
001 200 400 
002  100 
002 100 200 
003 500 100 
003 
003 700 
003 

...等,

我要计数(值)和计数(值2)不等于空。

预期产量。

EmpID Value1 Value2 

001  4  4 
002  1  2 
003  2  1 

...等,

如何计算的行值,如果它不等于空?

需要查询帮助。

+0

你的领域是空的或空的字符串? – Fredou 2009-08-17 12:54:15

+0

@Fredou - 空值 – Gopal 2009-08-17 14:21:10

+0

您的期望是不正确的。你的003行应该有2和1不是1和0. – 2009-08-17 14:30:10

回答

0

我有效认为我理解,但您可能需要稍微讨论一下... Access数据库引擎的IIF()函数执行测试,如果TRUE,则返回值1,否则返回值0.

select 
     EmpID, 
     sum(IIF(IsNull(Value1), 0, 1)) as Fld1WithValues, 
     sum(IIF(IsNull(Value2), 0, 1)) as Fld2WithValues 
    from 
     Table1 
    group by 
     EmpID; 

因此,尽管EmpID 1可能有6个条目,但是2是NULL,通过执行0或1的SUM(),所有记录都会分别计算每个字段,并且不会丢失任何内容该情况下值1或值2的值为空。他们在自己的价值观上进行测试。

+0

@DRapp - 只获取所有值的总数。 – Gopal 2009-08-17 14:22:30

+0

该查询将返回COUNTS ..即使它是一个SUM()聚合。如果值为NULL,则返回0,否则返回1.因此,对于员工1 ID,您可以在Value1字段计数下求和:1 + 0 + 1 + 1 + 0 + 1 = 4,总和为:0 + 1 +对于Value2字段计数,1 + 0 + 1 + 1 = 4。 – DRapp 2009-08-17 15:59:11

2

这似乎工作?

SELECT Table1.Field1, Count(Table1.Field2) AS CountOfField2, Count(Table1.Field3) AS CountOfField3 
FROM Table1 
GROUP BY Table1.Field1; 

,并在你的例子,003是2和1,而不是1和0

结果是:

Field1 CountOfField2 CountOfField3 
1   4    4 
2   1    2 
3   2    1 

这似乎是,如果场均NULL

+0

@Fredou。它显示行的总数,我只需要行数不等于null – Gopal 2009-08-17 12:49:09

+0

对于我运行上面的查询给我,001:4,4 002:1,2 003:2,1 – Fredou 2009-08-17 12:53:39

+0

将此添加到最后并看看会发生什么: WHERE isnull(Value1,'null')<>'null'或isnull(Value2,'null')<>'null' – 2009-08-17 13:00:18

1

如果你想整个表格去

SELECT 
    SUM (IIF(value1 IS NULL, 0, 1)) as NumNonNullValue1, 
    SUM (IIF(value2 IS NULL, 0, 1)) as NumNonNullValue2 

FROM Employee 

但如果你想非空值每名雇员的ID,然后在

SELECT 
    EmpID, 
    SUM (IIF(value1 IS NULL, 0, 1)) as NumNonNullValue1, 
    SUM (IIF(value2 IS NULL, 0, 1)) as NumNonNullValue2 

FROM Employee 

GROUP BY EmpID 

当然,有时只是通过EMPID是用于查询有用的,但不用于显示。您需要名称,所以我们添加名称字段(s)

SELECT 
    EmpID, 
    EmployeeName, 
    SUM (IIF(value1 IS NULL, 0, 1)) END as NumNonNullValue1, 
    SUM (IIF(value2 IS NULL, 0, 1)) END as NumNonNullValue2 

FROM Employee 

GROUP BY EmpID, EmpoyeeName 
+0

@Raj - 我得到了所有值的总数。我没有得到非空值的总数 – Gopal 2009-08-17 14:19:39

+0

对不起,我错过了访问2003年的一部分。我用SQL Server语法回答。 – 2009-08-17 14:24:36

0

这是一个Access特定的答案,但这是原始问题的上下文。您想要计算非Null值的发生率,而不是记录的数量。几个答案已经使用IIF()测试空,但您可以用ISNULL()和ABS()这样做更容易:

SELECT EmpID, Abs(Sum(Not IsNull([Value1]))) As Value1Count, 
    Abs(Sum(Not IsNull([Value2]))) As Value2Count 
    FROM MyTable 
    GROUP BY EmpID 

这似乎要简单得多我比使用IIF()。

+0

更简单的是在旁观者的眼中;)当它被移植到“合适的”SQL实现时,IIF()更容易转换为CASE..WHEN..ELSE..END表达式。 – onedaywhen 2009-08-18 15:10:05

+0

我认为当你说“正确”时,你拼错了“不同”。 – 2009-08-18 17:12:36

+0

'正确'=符合ISO SQL标准的现代,工业实力,专用SQL产品。 Access数据库引擎不支持SQL-92 CASE表达式语法有什么好理由吗? – onedaywhen 2009-08-19 08:47:18