SQL DISTINCT文で重複行を1行で表示する
下記のように「売上明細」のデータがあります。
| 売上NO | 社員コード | 売上日 | 売上金額 | 会社コード |
|---|---|---|---|---|
| 1 | 1 | 20150401 | 200 | 1 |
| 2 | 1 | 20150401 | 300 | 1 |
| 3 | 2 | 20150408 | 100 | 1 |
| 4 | 2 | 20150401 | 150 | 2 |
| 5 | 3 | 20150505 | 550 | 2 |
売上があった日にちを一覧で表示したい。
SQLは下記のようになります。
SELECT DISTINCT T1.売上日
FROM 売上明細 AS T1
ORDER BY T1.売上日| 売上日 |
|---|
| 20150401 |
| 20150408 |
| 20150505 |
SELECT句でSELECTのあとにDISTINCTを指定すると、重複した列は1行のみ出力するようになります。
売上NOが1と2と4のデータの売上日はともに20150401なのでDISTINCTを指定しなければ20150401のデータが3行表示されてしまいますが、DISTINCTを指定することにより1行のみ表示されるようになります。
DISTINCTで複数列を指定する
DISTINCTは取得した列のすべての項目が同一かどうかで、行の重複を判断しています。
例えば下記のようなSQLを実行した場合、売上日は重複していても、社員コードや会社コードが異なるので、売上NOが1と2と4のデータが表示されます。
売上日、社員コード、会社コードがすべて同じ値の場合のみ重複していると判断され、1行のみ表示されます。
SELECT DISTINCT T1.売上日
,T1.社員コード
,T1.会社コード
FROM 売上明細 AS T1
ORDER BY T1.売上日社員ごとに、売上があった日にちを一覧で表示したい。
SQLは下記のようになります。
SELECT DISTINCT
T1.社員コード
,T2.社員名
,T1.売上日
FROM 売上明細 AS T1
JOIN 社員マスタ T2
ON T1.社員コード = T2.社員コード
ORDER BY T1.社員コード, T1.売上日| 社員コード | 社員名 | 売上日 |
|---|---|---|
| 1 | 社員名1 | 20150401 |
| 2 | 社員名2 | 20150401 |
| 2 | 社員名2 | 20150408 |
| 3 | 社員名3 | 20150505 |
社員コード、社員名、売上日がすべて同一のデータは1行のみ表示されます。