スポンサーリンク

【access/SQL】WHEREの後に式で抽出条件を書きたい。WHERE HAVINGの使い分け

アクセス SQL
スポンサーリンク
※当サイトは広告を含みます

accessを自在に操りたい。
現状クエリにクエリを重ねて重ねて重ねてなんとか出したいものを出している。
SQLを自在に書ければするっと一発でできるに違いない。
なので、自宅待機中の機会にSQLを勉強中。の自分用記録。

◆やりたいこと:Q_E抽出 で Sフラグが1 または Mフラグが1の行を抽出したい。

いつもは別にカラム「フラグ:IIF(Sフラグ=1,1,Mフラグ=1,1,0))」を作って、別クエリ作成で「フラグ=1」を抽出していた。

〇SQL作成(★は目印。SQLとは関係なし)

SELECT E.取引先ID
FROM Q_E抽出 AS E
WHERE IIF(E.Sフラグ =1,1,IIF(E.Mフラグ=1,1,0)) =1   ★

できた。
Q_E抽出をAS句を使って「E」と簡略化しています。
AS句を使ったテーブル(クエリ)置き換えは便利です。
テーブルを差し替えたいとき変更箇所が1か所ですむので。

さらに
取引先IDをグループ化でまとめた

SELECT E.取引先ID
FROM Q_E抽出 AS E
WHERE IIF(E.Sフラグ =1,1,IIF(E.Mフラグ=1,1,0)) =1
GROUP BY E.取引先ID;               ★

さらに
件数計が0より大の取引先IDだけにする

SELECT E.取引先ID
FROM Q_E抽出 AS E
WHERE IIF(E.Sフラグ =1,1,IIF(E.Mフラグ=1,1,0)) =1    ★1
GROUP BY E.取引店ID, E.取引先ID
HAVING Sum(E.件数) > 0;             ★2

★1WHERE と ★2HAVING の違い。
いつも迷う。
WHERE で対象レコードの絞り込みをする
WHERE絞込後、グループ化集計後、HAVINGでレコード抽出

集計結果の値(Sum(件数))を評価する場合HAVING句を使う必要がある。

WHERE句は抽出後グループ化

HAVING句はグループ化、集計後抽出

なお、WHERE句はHAVING句で置き換えることが可能。
処理速度はWHERE句の方が早い。
HAVING句でしか指定できない条件はHAVING句、それ以外はWHERE句で記述するのがよい。

スポンサーリンク
スポンサーリンク
SQL
スポンサーリンク
mwkをフォローする
エクセルがともだち

コメント

タイトルとURLをコピーしました