5

私は2つのテーブルPersonSalary.

Person:

PersonId   |  Name   |   Surname
--------------------------------
       1      John          Deer
       2      Mark          Bear

Salary:

SId | PersonId | Date                       | Salary
----------------------------------------------------
1            2   2013-01-01 00:00:00.000      100
2            2   2012-01-01 00:00:00.000      90
3            2   2011-01-01 00:00:00.000      80

私がやろうとしているのは、人が給与レコードを持っている場合、結果に最新の給与情報を表示する必要があり、給与レコードがない場合、給与情報をnullとして表示する必要があるということです...

Result
------------------------------------------------------------------------
PersonId   |   Name   | Surname  |  Date                      |  Salary
       1       John        Deer     NULL                            NULL
       2       Mark        Bear     2013-01-01 00:00:00.000         100

このようなものでなければならないことはわかっていますが、知識が不足しているため、達成できませんでした..

SELECT 
    P.PersonId, P.Name, P.Surname, SL.Date, SL.Salary
FROM 
    PERSON P
LEFT OUTER JOIN 
    (SELECT TOP 1 S.PersonId, S.Date, S.Salary 
     FROM Salary 
     WHERE S.PersonId = P.PersonId ORDER BY Date DESC) SL
4

1 に答える 1

4

まず、CTE とROW_NUMBER()機能を使用して、人別および日付別に給与をランク付けします。これにより、個人ごとの最新の給与が降順で最初の位置に配置され、後でフィルター処理できます (ランク = 1)。その後、エイリアス化された CTE への単純なLEFT JOINfromになります。Person

WITH RankedSalaries AS
(
    SELECT 
        PersonId
        ,Date
        ,Salary
        ,ROW_NUMBER() OVER (PARTITION BY PersonId ORDER BY Date DESC) AS RowNum
    FROM 
        Salary
)
SELECT 
    p.PersonId
    ,p.Name
    ,p.Surname
    ,s.Date
    ,s.Salary
FROM
    Person p
LEFT JOIN
    RankedSalaries s
    ON
    p.PersonId = s.PersonId
WHERE
    s.RowNum = 1

または、CTE の内容を取得して、開始したクエリの括弧 (つまりLEFT JOIN (<CTE query>)) の間に移動することもできます。= 1制約を追加することを忘れないでください。

于 2013-05-17T23:16:47.690 に答える