次のクエリがあります。
select carBrand, carYear, carModel from cars;
私が欲しいのは、異なる車の名前だけを取得することです。
私はこれを書きましたが、それは私が望むものではありません。
select DISTINCT carBrand, carYear, carModel from Cars;
どうすればこの問題を解決できますか?
次のクエリがあります。
select carBrand, carYear, carModel from cars;
私が欲しいのは、異なる車の名前だけを取得することです。
私はこれを書きましたが、それは私が望むものではありません。
select DISTINCT carBrand, carYear, carModel from Cars;
どうすればこの問題を解決できますか?
DISTINCT は、特定の列ではなく、行全体で機能します。一意の名前を取得する場合は、その列のみを選択します。
SELECT DISTINCT carBrand FROM Cars
試す
SELECT carBrand , carYear ,carModel
FROM Cars
GROUP BY carBrand , carYear ,carModel;
受け入れられた回答が受け入れられた理由はわかりませんし、なぜ賛成されたのかは確かにわかりませんが、OPの質問には次のように記載されています。
私はこれを書きましたが、それは私が望むものではありません。
select DISTINCT carBrand, carYear, carModel from Cars;
受け入れられた答えは、使用することを提案しています:
SELECT carBrand , carYear ,carModel
FROM Cars
GROUP BY carBrand , carYear ,carModel;
OPのクエリとまったく同じ結果を返します。実際、回答の提案 (グループ化を使用) は、個別の結果を取得するために使用することさえ推奨されていませんが、集計には使用する必要があります。詳細については、この回答を参照してください。
さらに、SQL Server は、クエリに集計関数がない場合、クエリが実際に要求しdistinct
ていることを理解できるほどスマートなので、内部で使用distinct
されます。
@MarkByers が彼の回答で示したように、Distinct は行全体で個別の処理を行います。
上記をテストしたい人のために、3 つの列を持つテーブルを作成し、データを入力するスクリプトを次に示します。両方 (distinct
とgroup by
) は同じ結果セットを返します。
CREATE TABLE [dbo].[Cars](
[carBrand] [varchar](50) NULL,
[carYear] [int] NULL,
[carModel] [varchar](50) NULL
)
go;
insert into Cars values('BMW', 2000, '328 i');
insert into Cars values('BMW', 2000, '328 i');
insert into Cars values('BMW', 2000, '328 i');
insert into Cars values('BMW', 2000, '3M');
どちらのクエリも次の結果を返します。
carBrand carYear carModel
BMW 2000 328 i
BMW 2000 3M
結論
group by
個別のレコードが必要な場合は使用しないでください。を使用しdistinct
ます。などの集計関数を使用するgroup by
場合に使用します。SUM
COUNT
それはあなたが望むものに依存します。たとえば、'Toyota Corolla' と 'Toyota Camry' が必要で、年を無視する場合は、次のようにします。
SELECT DISTINCT carBrand + ' ' + carModel AS carName
FROM Cars;