SQLでデータの不一致を探す

次のようなテーブル「height」があったとします。名前と身長のデータです。
Suzukiが二つ入力されています。データが同じならば問題はないかもしれませんが、身長が異なります。
SQLを使って、このようなデータの不一致を探す方法を紹介します。Access2007で確認しました。

状況

id namae takasa
1 Suzuki 180
2 Tanaka 175
3 Takahashi 170
4 Suzuki 185

最大値と最小値の差を使う

サブクエリを使います。
二つ以上レコードがあって異なる身長が入力されているということは最大値と最小値に差があるということです。
まずnamae毎のtakasaの最大値と最小値を求めます。

SELECT namae, Max(takasa) AS maxtakasa, Min(takasa) AS mintakasa
FROM height
GROUP BY namae;

この結果を利用し、最大値と最小値の差がゼロより大きいレコードを抽出します。
上のSQLをFROM句に使います。セミコロンは削除します。

SELECT namae
FROM(
  SELECT namae, Max(takasa) AS maxtakasa, Min(takasa) AS mintakasa
  FROM height
  GROUP BY namae
)
WHERE maxtakasa - mintakasa > 0;

分散を使う

異なる身長が入力されているということは分散がゼロより大きいということです。
分散は、平均との差の二乗の平均なので、異なる値があれば必ずゼロより大きい値になります。

SELECT namae
FROM height
GROUP BY namae
HAVING Var(takasa)>0;

コメント

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