2017-06-08 5 views
0

下の図は、勘定の一覧表とカウントしたい結果を示しています。すなわち口座番号は106844で、結果は0ですが、私は通常、どうなることネストされたiifsよりも簡単な方法で、SQLサーバーの不一致条件を数えますか?

sum(iif([account] = '106719' and [Outcome] in ('MESSAGE','ESCALATION_EMAIL'),1,iif([account] = '310827' and [outcome] <> 'ABORT' and 'CALL_OUTCOME_LB' in ("Call patched to Customer Care","Message Taken"),1,iif(... , 0) as [Total Outcomes] 
ようIIFSの恐ろしい混乱であるとして、他の結果はカウント1としてカウントすべきである「MESSAGE」または「エスカレーションEMAIL」であるたびに

などですが、もっと簡単なやり方が必要な人や、7番目のネストされたiifでランダムなミスを犯して全体を乱す傾向があるように感じる人もいます。何か案は?

input

答えて

5

iif()を使用しないでください。これは、後方互換性のためにSQL Serverに組み込まれた関数です。MS ACCESS。なぜあなたはそのようなものに後方互換性を持たせたいのですか?

使用ANSI標準CASE式は:彼らはエスケープする必要はありませんので、私はまた、あなたの列に名前を付けるためにあなたを助言する

sum(case when account = '106719' and Outcome in ('MESSAGE', 'ESCALATION_EMAIL') 
      then 1 
      when account = '310827' and outcome <> 'ABORT' and 
       'CALL_OUTCOME_LB' in ("Call patched to Customer Care", "Message Taken") 
      then 1 
      . . . 
      else 0 
     end) as Total_Outcomes 

(なぜ「トータルアウトカムは、」「Total_Outcomesを」となりました)。それはコードを単純化します。

+0

ちょうど私が後にしたものと役に立つヒント。ありがとう。 – tomdemaine

+0

@ GordonLinoff 2つの機能的な違いはありませんでしたが、私が行った小さなパフォーマンステストでは全く違いは見られませんでした。 ANSII標準にする必要がある場合は、そのようにしてください。しかし、ほとんどの場合、その必要はありません。クエリを書くための一般的なルールは、人の読みやすさを向上させることです。これはかなり短いIIF構文を使用する私の場合です。 – Eli

-1

ええと...あります
最後のパラメータは、条件がfalseの場合、他のすべてがそこに落ちます。

SUM(IIF([ACCOUNT] = '106719' AND [OUTCOME] IN ('MESSAGE','ESCALATION_EMAIL'),1,0)) 
1

はなぜアカウントと結果を有するルックアップテーブルを使用して、それを使わないのでしょうか?要件が変更されると、ルックアップテーブルを更新してコードを心配する必要がなくなります。

+0

これは私が提案するものです。アカウント/結果の組み合わせごとに1行(アカウントごとに複数の行がある可能性があるため)。簡単な変更に*および*を書き込むようにクエリを簡単にします。 –

関連する問題