2016-11-29 5 views
0

助けてください - 私は難しい質問ではないはずのことを言います。 私はSQL Server 2012を使用しており、電子メールアドレスで顧客をリストしたいと考えています。内的結合のトップ1は、結果が期待できません

私は、デフォルトの電子メールアドレスとその人の電子メールアドレスを含む連絡先テーブルを含むCustomerテーブルを持っています。各顧客は複数の連絡先を持つことができます。連絡先は複数の目的に使用でき、目的ごとにContactDocumentOptionテーブルにエントリがあります。私はpurposetype = 102

を持つ連絡先にのみ興味があります。カスタマーごとに、タイプ102の連絡先のメールアドレスを表示したいと思います。タイプ102の連絡先がない場合は、顧客のデフォルトのメールアドレスを表示します。顧客は二つの接点を有し、第1の型102でない場合、その顧客のための最初の接触であることを起こる場合を除き

次のクエリdoesntのは、連絡先の電子メールを取得し、その後、連絡先の電子メールは

SELECT C.Code as Customer 
    , C.Name as CustomerName 
    , C.Email 
    , CC.Email 
    , ISNULL(CC.Email, C.Email) as Email 
FROM [dr].[Customer] C 
LEFT OUTER JOIN 
(
    Select TOP 1 CDO.ContactId 
     , CustomerId 
     , Email 
    from dr.Contact CC 
    INNER JOIN dr.ContactDocumentOption CDO on CDO.ContactId = CC.ContactId 
    where CDO.TransactionTypeId = 102 
    Order by Email 
) CC on CC.CustomerId = C.CustomerId 
nullです

これは、トップ1が102ということを確認する前にトップのコンタクトを取得したため、私は次のようにクエリを変更したが、同じ結果が得られたと考えている。

SELECT C.Code as Customer 
    , C.Name as CustomerName 
    , C.Email 
    , CC.Email 
    , ISNULL(CC.Email, C.Email) as Email 
FROM [dr].[Customer] C 
LEFT OUTER JOIN 
(
    SELECT CustomerId 
     , CT.ContactId 
     , Email 
    from dr.Contact CT 
    INNER JOIN 
    (
     Select TOP 1 ContactId from dr.ContactDocumentOption 
     where TransactionTypeId = 102 
    ) CDO on CDO.ContactId = CT.ContactId 
) CC on CC.CustomerId = C.CustomerId 

私は以前の投稿から助けを受けましたが、うまくいかなかったので、さらなる助けを求めています。ありがとうございました。

+0

SELECT TOP 1は、結果セットをクエリによって返される最初のレコードに限定します。 –

+0

クエリで空白を使用するのは怖いことではありません。それらのことが私の目を傷つけました。 –

+0

いくつかの同じデータと望ましい出力は、あなたがしようとしていることを理解するために長い道のりになります。ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

答えて

0

テーブルやデータについて詳しく知りませんが、質問に答えるのはかなり難しいですが、このようなことが始まりますか?
ct:
連絡先に102 TransTypeIDがあるかどうかを判断するには、COUNT()OVER()を使用します。
TransType 102がない場合、1つの電子メールだけを取得できるように行番号を付けます。
次に、TransType 102を持たないレコードとUnionを持つレコードを結合します。

;WITH cte as (
Select CDO.ContactId, 
     CustomerId, 
     Email, 
     CDO.TransactionTypeId, 
     COUNT(CASE WHEN TransactionTypeId = 102 THEN 1 ELSE 0 END) OVER (PARTITION BY Customerid) AS cnt, 
     ROW_NUMBER() OVER(PARTITION BY CustomerId ORDER BY TransactionTypeId ASC) as rn 
from dr.Contact CC 
INNER JOIN dr.ContactDocumentOption CDO 
     ON CDO.ContactId = CC.ContactId 
) 
SELECT CDO.ContactId, 
     CustomerId, 
     Email, 
     CDO.TransactionTypeId 
FROM cte c 
WHERE TransactionTypeId = 102 
UNION 
SELECT CDO.ContactId, 
     CustomerId, 
     Email, 
     CDO.TransactionTypeId 
FROM cte c 
WHERE cnt = 0 and rn = 1 
+0

トップ1は、条件に一致する最初の行を返します。で注文。あなたの最初の例では、最も低い電子メールアドレスを持つものが得られます。内部クエリを強調表示し、F5キーを押して取得する内容を確認してください。あなたはおそらく驚くでしょう。 –

関連する問題