我有以下查询;
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个条目为穷人
答案 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'