0

私のような同様の質問があることは知っていますが、残念ながら私の問題に対応する解決策は見つかりませんでした。

まず、テーブルの簡単な概要を次に示します。

  • Partnerテーブル:PartnerID, Name

  • Addressテーブル:PartnerID, Street, Postcode, City, ValidFrom

  • Contactテーブル:PartnerID, TypID, TelNr, Email, ValidFrom

パートナーは、1 つ以上の住所と連絡先情報を持つことができます。連絡先情報を使用すると、パートナーは 2 つの電話番号、1 つの携帯電話番号、および 1 つの電子メールを使用できます。表では、次のようになります。

PartnerID   TypID   TelNr                   Email               ValidFrom
1           1       0041 / 044 - 2002020                        01.01.2010
1           1       0041 / 044 - 2003030                        01.01.2011
1           2       0041 / 079 - 7003030                        01.04.2011
1           3                               myemail@hotmail.com 01.06.2011

最終的に必要なのは、各パートナーのすべてのテーブルを組み合わせると、次のようになります。

PartnerID   Name    Street              Postcode        City            TelNr                               Email
1           SomeGuy MostActualStreet    MostActualPC    MostActualCity  MostActual Nr (either type 1 or 2)  MostActual Email

何か助けはありますか?

4

2 に答える 2

1

「最も実際」が「最新」を意味する場合、あなたが探していると思う答えを得るいくつかのT-SQLを次に示します。

WITH LatestAddress (PartnerID,Street,PostCode,City) 
AS (
    SELECT PartnerID,Street,PostCode,City
    FROM [Address] a
    WHERE ValidFrom = (
        SELECT MAX(ValidFrom) 
        FROM [Address] aMax 
        WHERE aMax.PartnerID = a.PartnerID
    )
)

SELECT p.PartnerID,p.Name,la.Street,la.PostCode,la.City
,(SELECT TOP 1 TelNr FROM Contact c WHERE c.PartnerID = p.PartnerID AND TelNr IS NOT NULL ORDER BY ValidFrom DESC) AS MostRecentTelNr
,(SELECT TOP 1 Email FROM Contact c WHERE c.PartnerID = p.PartnerID AND Email IS NOT NULL ORDER BY ValidFrom DESC) AS MostRecentEmail
FROM [Partner] p
LEFT OUTER JOIN LatestAddress la ON p.PartnerID = la.PartnerID

この例では、共通テーブル式(CTE) を使用して各パートナーの最新の住所情報を取得しています。

WITH LatestAddress (PartnerID,Street,PostCode,City) 
AS (
    SELECT PartnerID,Street,PostCode,City
    FROM [Address] a
    WHERE ValidFrom = (
        SELECT MAX(ValidFrom) 
        FROM [Address] aMax 
        WHERE aMax.PartnerID = a.PartnerID
    )
)

Partner テーブルから CTE に左結合しました。これは、アドレスを持たないパートナーが結果から除外されることを望まなかったからです。

FROM [Partner] p
LEFT OUTER JOIN LatestAddress la ON p.PartnerID = la.PartnerID

SELECT ステートメントでは、Partner テーブルの CTE から列を選択し、2 つのサブセレクトを記述しました。1 つは各パートナーの最新の null 以外の電話番号用で、もう 1 つは各パートナーの最新の null 以外の電子メール アドレス用です。TOP 1 を選択してスカラー値を返すことを知っていたので、サブセレクトとしてこれを行うことができました。

SELECT p.PartnerID,p.Name,la.Street,la.PostCode,la.City
,(SELECT TOP 1 TelNr FROM Contact c WHERE c.PartnerID = p.PartnerID AND TelNr IS NOT NULL ORDER BY ValidFrom DESC) AS MostRecentTelNr
,(SELECT TOP 1 Email FROM Contact c WHERE c.PartnerID = p.PartnerID AND Email IS NOT NULL ORDER BY ValidFrom DESC) AS MostRecentEmail

古い電話番号と電子メール アドレスを保持できるようにする必要がある場合は、Contact テーブルを別の電話番号テーブルと電子メール テーブルに分け、それぞれに独自の ValidDate を設定することを強くお勧めします。

于 2012-11-05T20:15:34.327 に答える
0

あなたのようなケースで最も実際の情報を取得する方法を説明している別の投稿で私の回答をチェックしてください:各グループから最初のものだけを取得する SQL 関数の集計

PS:あなたの場合、DATE_FIELDはValidFromになります。

于 2012-11-05T15:30:15.650 に答える