2016-11-18 5 views
1

私は顧客とその支払い条件をいくつかの異なるテーブルから見つけるSQLクエリを持っています。SQL - 支払条件の異なる行のみを検索

クエリは次のとおりです。

SELECT 
    c.CustomerCode, c.CustomerName, cst.PaymentTermCode 
FROM 
    CustomerShipTo cst 
JOIN 
    Customer c ON cst.CustomerCode = c.CustomerCode 
WHERE 
    cst.IsActive = 1 AND c.IsProspect = 0 AND c.IsActive = 1 

複数の配送先住所を持つ顧客がすべて同じ支払条件になるわけではありません。このサンプルデータ、最後の2行、同じ顧客(CUST-006002)には、2つの異なる支払いコードを持つ2つの異なる配送先住所があるので、これらの行のみを選択します。

HAVING COUNT(CustomerCode) > 1句を最後に追加しようとしましたが、複数の配送先住所(Customer E)の顧客が同じ支払い期限を持つ顧客が存在することがあるため、望ましい出力が得られませんでした。

╔═══════════════╦═════════════════════════════╦═══════════════════╗ 
║ Customer Code ║ Shipping Address   ║ Payment Term Code ║ 
╠═══════════════╬═════════════════════════════╬═══════════════════╣ 
║ CUST-016714 ║ Company A - Sample Address ║ NET30EOM   ║ 
╠═══════════════╬═════════════════════════════╬═══════════════════╣ 
║ CUST-017457 ║ Company B - Sample Address ║ NET30EOM   ║ 
╠═══════════════╬═════════════════════════════╬═══════════════════╣ 
║ CUST-016464 ║ Company C - Sample Address ║ COD    ║ 
╠═══════════════╬═════════════════════════════╬═══════════════════╣ 
║ CUST-017215 ║ Company D - Sample Address ║ COD    ║ 
╠═══════════════╬═════════════════════════════╬═══════════════════╣ 
║ CUST-006001 ║ Company E - Sample Address1 ║ NET30EOM   ║ 
╠═══════════════╬═════════════════════════════╬═══════════════════╣ 
║ CUST-006001 ║ Company E - Sample Address2 ║ NET30EOM   ║ 
╠═══════════════╬═════════════════════════════╬═══════════════════╣ 
║ CUST-006002 ║ Company F - Sample Address1 ║ COD    ║ 
╠═══════════════╬═════════════════════════════╬═══════════════════╣ 
║ CUST-006002 ║ Company F - Sample Address2 ║ NET30EOM   ║ 
╚═══════════════╩═════════════════════════════╩═══════════════════╝ 

答えて

4

1つの方法でウィンドウ関数を使用します。 SQL Serverはウィンドウ機能としてCOUNT(DISTINCT)をサポートしていません。ただし、最小値と最大値を比較して複数の値があるかどうかを確認できます。

SELECT c.* 
FROM (SELECT c.CustomerCode, c.CustomerName, cst.ShippingAddress, 
      cst.PaymentTermCode, 
      MIN(cst.ShippingAddress) OVER (PARTITION BY c.CustomerCode) as minsa, 
      MAX(cst.ShippingAddress) OVER (PARTITION BY c.CustomerCode) as maxsa, 
      MIN(cst.PaymentTermCode) OVER (PARTITION BY c.CustomerCode) as minptc, 
      MAX(cst.PaymentTermCode) OVER (PARTITION BY c.CustomerCode) as maxptc 
     FROM CustomerShipTo cst JOIN 
      Customer c 
      ON cst.CustomerCode = c.CustomerCode 
     WHERE cst.IsActive = 1 AND c.IsProspect = 0 and c.IsActive = 1 
    ) c 
WHERE minptc <> maxptc AND minsa <> maxsa;