2016-11-14 18 views
0

Policy Numberは、複数の異なるClassCodeを持つことができ、1つだけ合計Premiumを持つことができます。私のSSRSレポートでは、パラメータClassCodeを作成できるようにしたいが、少なくとも1つを除外(チェックを外す)した場合は、プレミアムを含むポリシー番号全体を計算に入れないようにする必要があります。 ClassCode 58を除外したい場合は、Premiumの1,644.00が私の報告の結果ではないはずです。1つの値を除外し、その値を持つすべてを計算に入れない方法

enter image description here

私は私のクエリAND ClassCode <> 58に言ってみましたが、それだけで1行を除外し、プレミアムanountを保持します。しかし、私の目標は、それはあなたが最初に設定したいClassCodeを持っているすべてのポリシー番号を除外する必要がありClassCode 58

SELECT policynumber, 
     classcode, 
     /* 
     Using ROW_NUMBER() to check if it's the first record in the join and returns the Premium value if so, otherwise it will display 0. 
     The ORDER BY (SELECT 0) is there just because I don't need the row number to be based on any explicit order. 
     */ 
     CASE 
     WHEN ROW_NUMBER() 
       OVER (
        PARTITION BY cte1.policynumber 
        ORDER BY (SELECT 0)) = 1 THEN premium 
     ELSE 0 
     END  AS Premium, 
     c.yearnum TransEffYearNum, 
     c.monthnum TransEffMonthNum 
FROM cte1 
     INNER JOIN cte2 
       ON cte1.policynumber = cte2.policynumber 
     RIGHT JOIN tblcalendar c 
       ON c.yearnum = Year(cte1.policyeffectivedate) 
        AND c.monthnum = Month(cte1.policyeffectivedate) 
WHERE c.yearnum = 2016 
     AND classcode <> 58 
+0

ClassCodeはどのテーブルに属していますか? – DVT

+0

ClassCodeはクエリの 'cte2'に属します。私は最終的な 'SELECT'文しかここに表示しません。かなり長いクエリが発生します。 – Oleg

+0

あなたの質問の例では、ポリシー3を完全に排除するか、ClassCode 57のPremiumを0にするだけですか? – DVT

答えて

0

がある場合、すべてを除外することです。 その代わりに使用

where PolicyNumber NOT IN 
(SELECT PolicyNumber 
From cte1 inner join cte2 on cte1.PolicyNumber=cte2.PolicyNumber 
WHERE ClassCode = 58); 

where c.YearNum = 2016 AND ClassCode <> 58

、それはそれを行う必要があります。

0

ポリシー3のすべての行を削除したい場合、これはおそらく動作します。

SELECT policynumber, 
     classcode, 
     /* 
     Using ROW_NUMBER() to check if it's the first record in the join and returns the Premium value if so, otherwise it will display 0. 
     The ORDER BY (SELECT 0) is there just because I don't need the row number to be based on any explicit order. 
     */ 
     CASE 
     WHEN ROW_NUMBER() 
       OVER (
        PARTITION BY cte1.policynumber 
        ORDER BY (SELECT 0)) = 1 THEN premium 
     ELSE 0 
     END  AS Premium, 
     c.yearnum TransEffYearNum, 
     c.monthnum TransEffMonthNum 
FROM cte1 
     INNER JOIN cte2 
       ON cte1.policynumber = cte2.policynumber 
     RIGHT JOIN tblcalendar c 
       ON c.yearnum = Year(cte1.policyeffectivedate) 
        AND c.monthnum = Month(cte1.policyeffectivedate) 
WHERE c.yearnum = 2016 
     AND cte2.policynumber NOT IN (SELECT policynumber FROM cte2 WHERE ClassCode = 58 and policynumber IS NOT NULL); 
+0

ありがとう。正しいロジックのように見えますが、私のクエリは永遠に回転しています。何らかの理由で。 – Oleg

+0

私はあなたのcteを推測する?おそらく巨大です。しかし、それは別の問題です。 cte2の中のpolicynumber = 3を取り除きたいかもしれません。 – DVT

関連する問題