2017-10-02 7 views
0

各顧客に の複数の顧客グループを持つ顧客のリストがあります。例えば、単一の顧客は、 から1つのグループまで6つまでの異なるグループを持つことができます。SQL Serverの別のフィールドのオプションのシーケンスに基づいて顧客のリストを取得する2014

customerテーブルには、Dependentのリストと各DependentのTitleも含まれています。私はすべての顧客のために、すべての顧客グループ、CustGroupとタイトルによって優先順位に基づいて、単一の依存とタイトルを取得する必要があり

CustId CustName CustGroup Dependent Title 
1 Mike A Sarah SP 
1 Mike A Mitch SN 
1 Mike A Debra DT 
1 Mike A Conner SIL 
1 Mike B Sarah SP 
1 Mike B Mitch SN 
1 Mike B Debra DT 
2 Mark A Hamlin BT 
2 Mark A Ritchie SN 
2 Mark B Hamlin BT 
2 Mark B Ritchie SN 
3 Carrie A Aaron CR 
3 Carie A Simon CR 
3 Carie A Crane NP 
3 Carrie B Aaron CR 
3 Carrie B Simon CR 
3 Carrie B Crane NP 
3 Carrie C Aaron CR 
3 Carrie C Simon CR 
3 Carrie C Crane NP 

これは次のようにテーブルが見えるものです。同じタイトルの複数の扶養家族が存在する可能性があります。その場合、すべての扶養家族を引っ張ります。

CustGroup Aの場合、タイトルがSPの場合、まずDependentを引き出します。 SPがなければ、SNを引く。 SNがなければDTを引きます。それら3つのタイトルのいずれも存在しない場合は、それを空白のままにします。

CustGroup Bの場合、タイトルがDTの場合、まずDependentをプルします。 DTがなければ、CRを引く。それらの2つのタイトルのどちらもない場合は、それを空白のままにします。

CustGroup Cの場合、タイトルがSILの場合、まずDependentを取得します。 SILがない場合は、DTを引き出します。それらの2つのタイトルのどちらもない場合は、それを空白のままにします。すべてのヘルプは大歓迎されます

CustId CustName CustGroup Dependent Title 
1 Mike A Sarah SP 
1 Mike B Debra DT 
2 Mark A Ritchie SN 
2 Mark B <blank> <blank> 
3 Carrie A <blank> <blank> 
3 Carrie B Aaron CR 
3 Carrie B Simon CR 
3 Carrie C <blank> <blank> 

だから、期待される出力は次のようになります。

ありがとうございました。

編集:

私はこのコードと私は期待していたものに、その近くを試してみましたが、どのように私は空白を実装していますか?

Select * from 
(
Select *, ROW_NUMBER() OVER (PARTITION BY CustID, CustGroup order by RowNum asc) as TitleRowNum 
from 
(
Select 
CustId, CustName, CustGroup, [Dependent], Title, 
case 
    when CustGroup = 'A' and Title = 'SP' 
     then 1 
    when CustGroup = 'A' and Title = 'SN' 
     then 2 
    when CustGroup = 'A' and Title = 'DT' 
      then 3 

      when CustGroup = 'B' and Title = 'DT' 
       then 1 
      when CustGroup = 'B' and Title = 'CR' 
       then 2 

    when CustGroup = 'C' and Title = 'SIL' 
     then 1 
    when CustGroup = 'C' and Title = 'DT' 
     then 2 
else 4 end as RowNum 
from GroupContactTest 
) table1 

) table2 

where TitleRowNum = 1 
order by CustId, CustGroup; 
+2

これは学校からの割り当てのようです。何を試しましたか? –

+0

新しいCustグループがある場合はどうなりますか?それはどのような命令でしょうか?あなたのテーブルデザインはこれにうまく対応していません。 Group、title、sortrankを保持するさらなるルックアップテーブルを作成することは可能ですか? – SEarle1986

+0

可能なCustGroupは7つしかありません(A、B、C、K、M、V、Y)。すべての顧客は1〜7つのCustGroupsを持つことができます。すべての顧客は、各グループごとに1〜10人の扶養家族を持つことができ、そのうちいくつかは同じタイトルを持つことができます。必要に応じて、ルックアップ値を保持するテーブルを作成することができます。 –

答えて

1

これを試してください。注文が定義されているルックアップテーブルを使用します

CREATE TABLE SortOrder 
(
    CustGroup VARCHAR(1), 
    Title  VARCHAR(3), 
    SortRank INT 
) 

INSERT INTO SortOrder 
VALUES 
('A','SP',1), 
('A','SN',2), 
('A','DT',3), 
('B','DT',1), 
('B','CR',2), 
('C','SIL',1), 
('C','DT',2) 

SELECT c.*, 
     so.SortRank, 
     MIN(so.SortRank) OVER (PARTITION BY c.CustId, c.Custgroup) as minRank 
INTO #Dependants 
FROM GroupContactTest c 
     LEFT JOIN SortOrder so 
      ON c.CustGroup = so.CustGroup AND c.Title = so.Title 

SELECT * 
INTO #HasDependants 
FROM #Dependants 
WHERE minRank = SortRank 

SELECT DISTINCT 
     CustId, 
     CustName, 
     CustGroup 
INTO #DistinctDependants 
FROM #Dependants 
WHERE SortRank IS NULL 

SELECT a.CustId, 
     a.CustName, 
     a.CustGroup, 
     b.Dependent, 
     b.Title 
FROM #DistinctDependants a 
     LEFT JOIN #HasDependants b 
      ON a.CustId = b.CustId AND a.CustGroup = b.CustGroup 
+0

偉大な...ありがとう@ SEarle1986 ...それは美しく働いた...私は私の最後にもいくらか働いているが、私のクエリはむしろ乱雑に見えます。しかし、これは、私は大好き...もう一度ありがとう。 –

+0

probsはありません、私はもう少し調整することができると思うが、それは仕事をする! – SEarle1986

関連する問題