2016-07-12 5 views
0

データベース設定から始めよう:すべてが同じタイプの場合は、子ローのみを返すSQL

「クライアント」テーブルにはクライアントが含まれています。唯一の関連分野は次のとおりです。

Client.CLIENT 

「ポリシー」テーブルには3つの関連するフィールドでポリシーが含まれています

Policy.CLIENT 
Policy.POLICY 
Policy.CLASS 
私は、クライアントが1つの以上のポリシーを持っているポリシーのリストを返す必要が

とのすべてのポリシーは同じクラスのポリシーです。

たとえば、のは、政策の3つのクラス(A、B、およびC)があるとしましょう。

  • クライアントに3つのポリシーがあり、それらのすべてがクラス "A"である場合は、それらのポリシー行を返します。
  • クライアントにポリシーが1つしかない場合は、その行を戻さないでください。
  • クライアントに3つのポリシーがあり、2つがクラス "A"であり、1がクラス "B"である場合は、いずれの行も返しません。私は私の質問を拡張することができない場合は、理にかなって

うまくいけば。

ありがとうございます!

+0

http://sqlfiddle.comを使用してサンプルデータを用意してくださいおもちゃに有用である可能性および所望の結果 – lad2025

+0

あなたが説明したデータはあなたにシンプルに見えるかもしれませんが、他の人が理解するために、そのハード、最良の方法は、いくつかのサンプルデータを用意することで、期待される結果、あなたは残念ながらlad2025 @ – TheGameiswar

+0

を試してみました任意のクエリ、sqlfiddleは働いていません最後の数ヶ月間。それはあなたのために働くのですか? – Lamak

答えて

1

これは、それが効率的である必要があり、ゴードン・リノフが提案方法で行うことができます。あなたは、ウィンドウ関数のファンじゃないなら、これはうまく仕事をしなければならないし、あまりにも他のSQL方言で動作します:

CLIENT_ID CLIENT_NAME POLICY CLASS 
--------- ----------- -------- ----- 
1   CLIENT 1 POLICY 1 A  
1   CLIENT 1 POLICY 2 A  
1   CLIENT 1 POLICY 3 A 
  • クライアント1があります。結果だ

    DECLARE @Client TABLE 
    (
        CLIENT_ID INT 
        , CLIENT_NAME VARCHAR(10) 
    ); 
    
    DECLARE @Policy TABLE 
    (
        CLIENT_ID INT 
        , POLICY VARCHAR(10) 
        , CLASS VARCHAR(1) 
    ); 
    
    INSERT INTO @Client (CLIENT_ID, CLIENT_NAME) 
    VALUES (1, 'CLIENT 1') 
        , (2, 'CLIENT 2') 
        , (3, 'CLIENT 3'); 
    
    INSERT INTO @Policy (CLIENT_ID, POLICY, CLASS) 
    VALUES (1, 'POLICY 1', 'A') 
        , (1, 'POLICY 2', 'A') 
        , (1, 'POLICY 3', 'A') 
        , (2, 'POLICY 4', 'A') 
        , (2, 'POLICY 5', 'A') 
        , (2, 'POLICY 6', 'B') 
        , (3, 'POLICY 7', 'A'); 
    
    SELECT C.CLIENT_ID, C.CLIENT_NAME, P2.POLICY, P2.CLASS 
    FROM @Client AS C 
    INNER JOIN (
        SELECT CLIENT_ID 
        FROM @Policy 
        GROUP BY CLIENT_ID 
        HAVING COUNT(DISTINCT CLASS) = 1 
        AND COUNT(CLASS) > 1 
        ) AS P 
        ON P.CLIENT_ID = C.CLIENT_ID 
    INNER JOIN @Policy AS P2 
        ON P2.CLIENT_ID = P.CLIENT_ID; 
    

    3つのA政策、それは

  • 持ち帰っだ理由は、それがバック
  • クライアント3を持っていないので、クライアント2は、2 Aと1 Bポリシーを持っています - ちょうど1 A政策をしていることがdata.stackexchange.comに戻っ

クエリを持っていない:https://data.stackexchange.com/stackoverflow/query/511200

は約

+0

私は、Count(CLASS)からCount(*)に切り替えるだけで、今後このクエリに対処しなければならない人に少し混乱させるようにしました。 –

+0

@ D.R。うん、それも動作します。 –

1
select Policy.CLIENT 
from policy 
group by Policy.CLIENT 
having count(*) > 1 and count(distinct(Policy.class)) = 1 


select Policy.CLIENT, policy.policy 
from policy 
group by Policy.CLIENT, policy.policy 
having count(*) > 1 and count(distinct(Policy.class)) = 1 
+1

その答えは取れません。クラスは全く考慮に入れません –

+0

あなたの答えを更新していただきありがとうございます。これが私にとってうまくいくかどうかを確認してみます。 –

0

あなたはポリシーのリストが必要な場合は、1つのオプションウィンドウ関数である:

select p.* 
from (select p.*, 
      count(*) over (partition by p.client) as cnt, 
      min(p.class) over (partition by p.client) as minc, 
      max(p.class) over (partition by p.client) as maxc 
     from policies p 
    ) p 
where cnt > 1 and minc <> maxc; 
関連する問題