1

日付範囲内のユーザーの結果を合計する単純な集計クエリを実行しようとしています。すべてのユーザーを選択したいのですが、適切なレコードがない場合、クエリはそれらに対して 0 を返す必要があります。

問題は、ユーザー ID を選択するテーブルの右外部結合を使用しても、左側のテーブルのその日付範囲に存在するユーザーのみが選択されることです...

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

select B.fld_strcode, sum(ISNULL(fld_val, 0)) as res
from tbl_transproc A right outer join tbl_pr B on A.fld_int_id = B.fld_auto_int_id
where A.fld_dtmservicedate between '2012-04-01' and '2012-05-01'
and B.fld_bytprtypeid = 1
group by B.fld_strcode

このクエリは 13 行を返します。ID (fld_strcode) のみを選択するクエリは、25 個の一意の結果を返します。(ID ごとに) 25 行を返し、値のない行は値が 0 になるようにします。日付範囲を取り出すと (テーブル内のすべての結果を調べます)、すべてのユーザーに対して機能します。常にすべてのユーザーがテーブルに少なくとも 1 つのレコードを持つため、これは理にかなっています。一部のユーザーは、数か月間レコードを持っていません。この場合、0 を返す必要があります。

どうすればそれを達成できるかについてのアイデア。

4

1 に答える 1

3

外部結合をフィルタリングするときは、結合自体でそれを行うことを忘れないでください。そうしないと、マスクされた内部結合になってしまいます。

select B.fld_strcode, sum(ISNULL(fld_val, 0)) as res
  from tbl_transproc A 
 right outer join tbl_pr B 
    on A.fld_int_id = B.fld_auto_int_id
   AND A.fld_dtmservicedate between '2012-04-01' and '2012-05-01'
 where B.fld_bytprtypeid = 1
 group by B.fld_strcode

より複雑なクエリでは、特にクエリ デザイナーが好むように右結合と左結合を混在させると、読み取り不能になるため、テーブルを切り替えて左結合を取得します。

于 2012-05-26T17:43:35.127 に答える