1

私はページングシステムを使用しています。同僚の中には、ディレクトリのようなものを作成する必要がある人もいます。ディレクトリ内の各人には、PAGER_IDとMESSAGING_IDがあります。PAGER_IDは特定のページングデバイスに固有であり、MESSAGING_IDは個人に固有です。グループがシフトで作業し、1つのデバイスをシフトからシフトに渡すと、複数の人が同じPAGER_IDと異なるMESSAGING_IDを持つ場合があります。これは問題なく、設計によるものです。

私たちのディレクトリでは、ユーザーは次の基準が満たされることを望んでいます。

  1. 各PAGER_IDは1回だけ表示されます(これは、PAGER_IDに対してSELECT TOP 1で実行できることはわかっています)
  2. 10桁のMESSAGING_IDは、PAGER_IDに10桁のMESSAGING_IDがあり、1つ以上の他のMESSAGING_IDの桁数が異なる場合に推奨されます。
  3. 10桁のMESSAGING_IDがない場合は、他の桁数のMESSAGING_IDで十分です。

簡潔に言うと、PAGER_ID/MESSAGING_IDのレコードを1つだけ表示したいと考えています。彼らは、すべての個人がディレクトリにリストされているかどうかを気にしません。各PAGER_IDが1つのMESSAGING_IDのみでディレクトリに表示され、10桁のMESSAGING_IDが10桁以外の長さよりも優先される限り、どのMESSAGING_IDを実際に気にする必要はありません。

TOPクエリとIIFクエリの組み合わせを試しましたが、必要な方法ですべてをうまく連携させることができませんでした。

私の基本的な選択クエリは次のとおりです。

SELECT
    tbl_Amcom_Prod.NAME,
    tbl_Amcom_Prod.PAGER_ID,
    tbl_Amcom_Prod.MESSAGING_ID
FROM tbl_Amcom_Prod
WHERE
    (((tbl_Amcom_Prod.PAGER_ID) Like "241662"
    Or (tbl_Amcom_Prod.PAGER_ID) Like "18888"))
ORDER BY tbl_Amcom_Prod.PAGER_ID;

結果は次のようになります。

|     NAME       | PAGER_ID | MESSAGING_ID |
--------------------------------------------
| TESTER 1       |    18888 | 18888        |
--------------------------------------------
| SMITH, MARK    |    18888 | 5735551262   |
--------------------------------------------
| SUPERVISOR     |   241662 | 102621       |
--------------------------------------------
| JOHN, JONES    |   241662 | 101436       |
--------------------------------------------
| SEEGER, ROBERT |   241662 | 101409       |
--------------------------------------------

彼らはこれを見たいと思っています:

|     NAME       | PAGER_ID | MESSAGING_ID |
--------------------------------------------
| SMITH, MARK    | 18888    | 5735551262   |
--------------------------------------------
| SUPERVISOR     | 241662   | 102621       |
--------------------------------------------

何か案は?

4

3 に答える 3

1

多分:

SELECT tt.NAME, tt.PAGER_ID, tt.MESSAGING_ID
FROM tt
WHERE tt.PAGER_ID In (
    SELECT [PAGER_ID] 
    FROM tt a 
    WHERE  a.MESSAGING_ID IN (
        SELECT TOP 1 MESSAGING_ID 
        FROM tt 
        ORDER BY Len(MESSAGING_ID) DESC,PAGER_ID))

ここで、ttはテーブルです。

于 2013-01-17T21:22:08.617 に答える
1

テーブルがMyTableであるとしましょう。必要なのは、グループ化することだけです。

SELECT FIRST(Name), PAGER_ID,  MAX(MESSAGING_ID)
FROM MyTable
GROUP BY PAGER_ID
于 2013-01-17T22:07:13.977 に答える
1

PAGER_IDとが両方ともテキストデータ型である場合MESSAGING_ID、このクエリは要求した結果を返します。

SELECT
    t.NAME,
    t.PAGER_ID,
    t.MESSAGING_ID
FROM
    (
        SELECT
            sub1.PAGER_ID,
            DLookUp(
                "MESSAGING_ID",
                "tbl_Amcom_Prod",
                "PAGER_ID = '" & sub1.PAGER_ID &
                    "' AND Len(MESSAGING_ID) = " &
                    sub1.MESSAGING_ID_max_length
            ) AS MESSAGING_ID
        FROM
            (
                SELECT
                    PAGER_ID,
                    Max(Len(MESSAGING_ID))
                        AS MESSAGING_ID_max_length
                FROM tbl_Amcom_Prod
                GROUP BY PAGER_ID
            ) AS sub1
    ) AS sub2
    INNER JOIN tbl_Amcom_Prod AS t
    ON sub2.MESSAGING_ID = t.MESSAGING_ID
WHERE t.PAGER_ID In ("241662","18888")
ORDER BY t.PAGER_ID;

PAGER_IDがテキストではなく長整数の場合は、...を使用します。

            DLookUp(
                "MESSAGING_ID",
                "tbl_Amcom_Prod",
                "PAGER_ID = " & sub1.PAGER_ID &
                    " AND Len(MESSAGING_ID) = " &
                    sub1.MESSAGING_ID_max_length
            ) AS MESSAGING_ID

と ...

WHERE t.PAGER_ID In (241662,18888)

MESSAGING_IDがテキストではなく長整数の場合は、に変更Max(Len(MESSAGING_ID))します。Max(Len(CStr(MESSAGING_ID)))Len(MESSAGING_ID)Len(Cstr(MESSAGING_ID))

于 2013-01-18T19:06:22.853 に答える