sql >> データベース >  >> RDS >> Sqlserver

結果から n 番目の値または NULL を返す

    ROW_NUMBER() を使用します .最初に各レコードに行番号を割り当てます:

    SELECT  cca.ClientContactId,
            a.Description,
            RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId 
                                            ORDER BY a.AttributeId)
    FROM    ClientContactAttributes AS cca
            INNER JOIN Attributes AS a
                ON a.AttributeId = cca.AttributeId;
    

    次に、この RowNumber を使用できます PIVOT あなたのデータ:

    WITH Data AS
    (   SELECT  cca.ClientContactId,
                a.Description,
                RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId 
                                                ORDER BY a.AttributeId)
        FROM    ClientContactAttributes AS cca
                INNER JOIN Attributes AS a
                    ON a.AttributeId = cca.AttributeId
    )
    SELECT  pvt.ClientContactID,
            Attribute1 = pvt.[1],
            Attribute2 = pvt.[2],
            Attribute3 = pvt.[3],
            Attribute4 = pvt.[4]
    FROM    Data
            PIVOT
            (   MAX(Description)
                FOR RowNumber IN ([1], [2], [3], [4])
            ) AS pvt;
    

    編集

    わからないならちゃんと答えていない!私は、ことわざ 「人に魚を与えれば、その人を 1 日養うことができます。人に魚の釣り方を教えれば、その人を一生養うことができます」 を固く信じています。

    2 つのテーブルに次のデータがある場合:

    属性 '

    AttributeId | Description
    ------------+---------------
        1       |     Bed          
        2       |     Bath        
        3       |    Beyond 
    

    ClientContactAttributes

    ClientContactID | AttributeId
    ----------------+---------------
           1        |    1
           1        |    2
           1        |    3
           2        |    1
    

    以下を実行:

    SELECT  cca.ClientContactId,
            a.Description,
            RowNumber = ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId 
                                            ORDER BY a.AttributeId)
    FROM    ClientContactAttributes AS cca
            INNER JOIN Attributes AS a
                ON a.AttributeId = cca.AttributeId;
    

    以下を提供します:

    ClientContactID | Description | RowNumber
    ----------------+-------------+-----------
           1        |     Bed     |     1
           1        |     Bath    |     2
           1        |    Beyond   |     3
           2        |     Bed     |     1
    

    ROW_NUMBER() 関数は、各グループに一意の番号を割り当てるだけです (PARTITION BY で定義)。 句)、この数は ORDER BY によって決定されます 句。この行:

    ROW_NUMBER() OVER(PARTITION BY cca.ClientContactId ORDER BY a.AttributeId)
    

    cca.ClientContactId の一意の値ごとに本質的に言っています attributeId の最小値が 1 から始まる一意の番号が必要です 1 を受け取り、そこから数が増えます:

    PIVOT 関数は、行を列に変換する Excel のピボット テーブルによく似ています。これには 2 つの基本的な部分があり、ここでは逆方向に作業します。最初の部分は FOR です 節:

    FOR RowNumber IN ([1], [2], [3], [4])
    

    これは RowNumber の値です 行に変換する列。列名は、指定された値に対応します。 2 番目の部分 (最初の論理読み取り) では、これらの新しく作成された列に入る値を定義します。これは集約関数である必要があり、この場合は次のようになります:

    MAX(Description)
    

    RowNumber はすでに知っているので、 ClientContactId ごとに一意です 、集計関数 (PIVOT` に必要) は実際には意味がありません。集計する説明の値が 1 つしかないためです。

    うまくいけば、これがもう少し理にかなっています.




    1. SQLiteユニオン

    2. UNIQUEKEYに違反したときに行のIDを取得する

    3. Oracleの日時形式要素のリスト

    4. PostgreSQLのディザスタリカバリにBarmanを使用する