使用多个where访问ms的条件进行计数

时间:2012-09-24 07:15:52

标签: sql ms-access count

我有以下查询;

Select count(*) as poor
from records where deviceId='00019' and type='Poor' and timestamp between #14-Sep-2012 01:01:01# and #24-Sep-2012 01:01:01#

表就像; ID。 deviceId,type,timestamp

数据就像;

数据就像;

1, '00019', 'Poor', '19-Sep-2012 01:01:01'
2, '00019', 'Poor', '19-Sep-2012 01:01:01'
3, '00019', 'Poor', '19-Sep-2012 01:01:01'
4, '00019', 'Poor', '19-Sep-2012 01:01:01'

我正在尝试计算具有特定特定类型的设备。

请帮助..访问始终返回错误的数据。它返回1而00019有4个条目为穷人

2 个答案:

答案 0 :(得分:2)

类型和时间戳都是保留字,因此请将它们放在查询的方括号中,如下所示:[type][timestamp]。我怀疑这些保留字是导致问题的原因,但很难准确预测保留字何时会导致查询问题,所以只需使用方括号排除这种可能性。

除此之外,存储的文本值有时包含额外的不可见字符。检查存储的文本值的长度,看是否有任何超过预期的值。

SELECT
    Len(deviceId) AS LenOfDeviceId,
    Len([type]) AS LenOfType,
    Len([timestamp]) AS LenOfTimestamp
FROM records;

在评论中,您提到了存储值中的空格(ASCII值32)。我一直以为我们正在处理其他不可打印/不可见的角色。如果在存储的deviceId值的开头和/或结尾处有一个或多个实际空格字符,Trim()函数将丢弃它们。因此,此查询将在两列中为您提供不同的长度数字:

SELECT
    Len(deviceId) AS LenOfDeviceId,
    Len(Trim(deviceId)) AS LenOfDeviceId_NoSpaces
FROM records;

如果存储的值包含字符串中的空格(不仅仅是在开头和/或结尾),Trim()也不会删除它们。在这种情况下,您可以使用Replace()函数丢弃所有空格。但请注意,使用Replace()的查询必须在Access应用程序会话中运行 - 您无法从Java代码中使用它。

SELECT
    Len(deviceId) AS LenOfDeviceId,
    Len(Replace(deviceId, ' ', '')) AS LenOfDeviceId_NoSpaces
FROM records;

如果该查询在两列中返回相同的长度数,那么我们不会处理实际的空格字符(ASCII值32)......但是其他一些类型的字符看起来像空格一样" #34 ;.

答案 1 :(得分:0)

如果您想对具有特定类型的设备进行计数而不考虑设备ID,请使用:

Select count(*) as excellent
from records where type='Poor'

如果您想对具有特定deviceid的设备进行计数,无论其类型如何,请使用:

Select count(*) as excellent
from records where deviceId='00019'