[SQL Server] DISTINCT - 重複行を除外してデータの取得方法

inno
2014-10-03 14:55 3141 0
MS-SQL / SQL Server
DISTINCT - 重複行を除外してデータの取得方法

DISTINCT句は重複したデータを場外することができます。

では、テストしてみましょう。
下記のSQLを実行してテスト用のテーブルとデータを作成します。

CREATE TABLE dbo.TempData
(
Sn int
)

INSERT INTO dbo.TempData (Sn) VALUES (1)
INSERT INTO dbo.TempData (Sn) VALUES (1)
INSERT INTO dbo.TempData (Sn) VALUES (1)
INSERT INTO dbo.TempData (Sn) VALUES (2)
INSERT INTO dbo.TempData (Sn) VALUES (3)
INSERT INTO dbo.TempData (Sn) VALUES (3)
INSERT INTO dbo.TempData (Sn) VALUES (4)
INSERT INTO dbo.TempData (Sn) VALUES (5)
INSERT INTO dbo.TempData (Sn) VALUES (5)
INSERT INTO dbo.TempData (Sn) VALUES (5)

データには1~5までの数字を重複するデータを含めて10件のデータを登録しました。

普通にテーブルをSELECTすると下記のような結果が出ます。

SELECT Sn FROM dbo.TempData

実行結果

Sn
-----------
1
1
1
2
3
3
4
5
5
5

ですが、重複するデータを場外して表示したい場合は下記のようにDISTINCTを使います。

SELECT DISTINCT Sn FROM dbo.TempData

実行結果

Sn
-----------
1
2
3
4
5


登録されている10件のデータの内5件のデータが取得されました。

DISTINCTを使わなくても同じ結果を得る方法があります。

それが「GROUP BY」です。

SELECT Sn FROM dbo.TempData GROUP BY Sn

上記のように「Sn」を「GROUP BY」すると「DISTINCT」と同じ結果を得ることができます。

実行結果

Sn
-----------
1
2
3
4
5


では、重複行を除外したデータの行数をカウントした場合!!!

その時は下記のように作成します。

SELECT COUNT(DISTINCT Sn) FROM dbo.TempData

実行結果

-----------
5

簡単でしょう?

もしくは下記のようにも作成できます。

SELECT COUNT(Sn) 
FROM 
(
SELECT DISTINCT Sn FROM dbo.TempData
) A

また、「GROUP BY」してから行数をカウントする方法もあります。

SELECT COUNT(Sn) 
FROM 
(
SELECT Sn FROM dbo.TempData GROUP BY Sn
) A

全部同じ結果が得られます。

簡単ですし、頻繁に使う部分ですので、覚えておくとイイですよ。

コメント