1

以下のクエリがあります。

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、タイプ、タイムスタンプ

データは似ています。

データは似ています。

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 つあります。

4

2 に答える 2

2

タイプとタイムスタンプはどちらも予約語であるため、クエリでは次のように角括弧で囲みます: [type]and [timestamp]. これらの予約語が問題の原因であるとは思えませんが、予約語がいつクエリの問題を引き起こすかを正確に予測することは難しいため、角括弧を使用してこの可能性を除外してください.

さらに、保存されたテキスト値に余分な非表示文字が含まれることがありました。格納されたテキスト値の長さをチェックして、予想よりも長いものがないかどうかを確認します。

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

コメントでは、保存された値にスペース (ASCII 値 32) を記載しました。私は、印刷できない/見えない他の文字を扱っていると思っていました。deviceId格納された値の先頭または末尾に 1 つ以上の実際の空白文字がある場合、Trim()関数はそれらを破棄します。したがって、このクエリでは、2 つの列で異なる長さの数値が得られます。

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) ではなく、「スペースのように見える」他のタイプの文字を扱っています。

于 2012-09-24T16:12:31.593 に答える
0

デバイスIDに関係なく、特定のタイプのデバイスをカウントする場合は、次を使用します。

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

タイプに関係なく特定のデバイスIDを持つデバイスをカウントする場合は、次を使用します。

Select count(*) as excellent
from records where deviceId='00019'
于 2012-09-24T07:18:55.250 に答える