0

代替識別子を持つ ID を保持するテーブルがあります。

ID| Alternate
1 | 100000000
1 | 8471
1 | 1248

2 | 578887518
2 | 8415
2 | 3574

3 | 100000000
3 | 1248

代替識別子には、9 桁と 4 桁の 2 種類があります。すべての ID には 9 桁の代替番号があり、次に最大 4 つの異なる 4 桁の番号があります。

私の問題は、テーブルが一意ではないことです。上記の ID の例 1 と 3 に似たケースが存在します。まだ見つかっていませんが、9 桁の ID は一致するが 4 桁の ID が異なるという状況もおそらく存在します。

ID | Alternate
5  | 200000000
5  | 1234

6  | 200000000
6  | 4567

私の目標は、テーブルを作成し、代替識別子の値にピボットすることですが、現在、同じユーザーに対して 2 つの行を取得しています。

誰かがこれを修正する方法を知っていますか?
現在のコード

SELECT  ID,  [THCI], [2101] , [2202], [2245] 
FROM          
    (SELECT     
        T1.[ID], 
        T1.[IDENTIFIER],
        CASE WHEN T2.[MAIN_IDENT] IS NULL THEN 'THCI' ELSE T2.[MAIN_IDENT] END AS PIV

    FROM MYTABLE T1
        LEFT OUTER JOIN TABLE2 AS T2 ON T2.[REFNO] = T1.[REFNO]
    WHERE 
        (LEN(T2.[MAIN_IDENT]) = 4 OR T2.[MAIN_IDENT] IS NULL)
        AND (LEN(T1.[IDENTIFIER]) = 4 OR LEN(T1.[IDENTIFIER]) = 9)
    ) AS SourceTable 
PIVOT (MAX([IDENTIFIER]) FOR PIV IN ([THCI], [2245], [2202], [2101],[2345],[2303])) AS MYPIV

編集: 期待される出力は次のようになります。また、3 つではなく 4 つの代替識別子であることにも注意してください。

[ID] | [THCI]      | [2245] | [2202] | [2101] | [2345] 
1    | 100000000   | 4817   | 6824   | NULL   | 1587
2    | 845279514   | 2359   | 7847   | 1234   | NULL
3    | 415784521   | 2415   | NULL   | NULL   | 8747
4

1 に答える 1

0

重複する値を省略してデータを取得するだけの場合は、最初に 9 文字IDENTIFIER(MAX(ID) でグループ化) のデータを取得し、次に 4 文字でフィルター処理された同じテーブルと結合することで実行できますIDENTIFIER。したがって、内側の SELECT ステートメントは次のようになります (PIVOT を適用します)。

SELECT 
    IDENT9.ID,
    IDENT9.IDENTIFIER,
    IDENT4.IDENTIFIER
FROM
    (SELECT     
    MAX([ID]) ID, 
    [IDENTIFIER],
    FROM MYTABLE
    WHERE LEN([IDENTIFIER]) = 9
    GROUP BY [IDENTIFIER]) AS IDENT9
LEFT OUTER JOIN
    (SELECT     
    MAX([ID]) ID, 
    [IDENTIFIER],
    FROM MYTABLE
    WHERE LEN([IDENTIFIER]) = 4
    GROUP BY [IDENTIFIER]) AS IDENT4
ON IDENT4.ID = IDENT9.ID

ここでの考え方は、9 文字の識別子と 4 文字の識別子を別々の列に入れることです。IDENT4 および IDENT9 ビューの目的は、重複を削除することです。

ただし、データベースの整合性を修正することが目的の場合は、9 文字と 4 文字の識別子を 2 つの別個のテーブルに分けることを考える必要があります。あなたが言ったことから、すべての ID には 1 つの 9 文字の識別子と少なくとも 1 つ (または複数) の 4 文字の識別子があると推測できます。したがって、IDENT9 クエリをベースとして 9 文字の ID を保持するマスター テーブルと、4 文字の「スレーブ」ID テーブルを作成します。これらのテーブルを使用すると、重複チェックを強制するデータベース レベルで制約を作成できます。

于 2013-01-10T04:47:32.320 に答える