ここに長いコメント;
ええ、あなたはそれをすることはできません。考えてみてください...そのようなテーブルがある場合:
Col1 Col2 Col3
A A 1
B A 2
C A 3
そして、あなたはCol2
だけでグループ化しています 、1つの行にグループ化されます... Col1
はどうなりますか およびCol3
?どちらにも3つの異なる行値があります。DBMSはそれらをどのように表示することになっていますか?
Col1 Col2 Col3
A? A 1?
B? 2?
C? 3?
これが、すべての列でグループ化するか、そうでなければそれらを集約または連結する必要がある理由です。 (SUM()
、MAX()
、MIN()
など)
結果をどのように見せたいかを教えてください。私たちがお手伝いできると確信しています。
編集-回答:
まず、質問を更新していただきありがとうございます。クエリにid
がありません しかし、あなたの期待する結果はそうなので、私はそれぞれに別々に答えます。
id
なし
目的を達成するには、すべての列でグループ化する必要があります。それを見ていきましょう。
グループ化せずにクエリを実行する場合:
select col1, col2, col3 from table where col3='200'
あなたはこれを取り戻すでしょう:
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 |
| 5 | some text 1 | 200 |
| 1 | some text 1 | 200 |
+----------+-------------+-------+
したがって、col1 = 1
のみを表示する必要があります。 一度行。ただし、そのためには、すべてをロールする必要があります。 列の数が増えるので、DBMSは各列をどう処理するかを認識します。 col1
のみでグループ化しようとした場合 、col2
の余分なデータをどう処理するかを指示しなかったため、DBMSはエラーを起こします。 およびcol3
:
select col1, col2, col3 from table where col3='200' group by col1 --Errors
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 |
| 5 | some text 1 | 200 |
| ? | some text 1?| 200? |
+----------+-------------+-------+
3つすべてでグループ化すると、DBMSは行全体をグループ化することを認識し(これは必要なものです)、重複する行を1回だけ表示します。
select col1, col2, col3 from table where col3='200' group by col1, col2, col3
+----------+-------------+-------+
| col1 | col2 | col3 |
+----------+-------------+-------+
| 1 | some text 1 | 200 |
| 2 | some text 1 | 200 | --Desired results
| 5 | some text 1 | 200 |
+----------+-------------+-------+
id
を使用
id
を見たい場合 、DBMSにどのid
を指定する必要があります 表示する。すべての列でグループ化しても、id
が原因で、目的の結果が得られません。 列によって各行が区別されます(グループ化されなくなります):
select id, col1, col2, col3 from table where col3='200' group by id, col1, col2, col3
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 | --id = 2
| 3 | 2 | some text 1 | 200 |
| 7 | 5 | some text 1 | 200 |
| 8 | 1 | some text 1 | 200 | --id = 8
+--------+----------+-------------+-------+
したがって、これらの行をグループ化するには、id
をどうするかを明示的に指定する必要があります。 s。希望する結果に基づいて、id = 2
を選択します。 、これは最小 id
、それではMIN()
を使用しましょう :
select MIN(id), col1, col2, col3 from table where col3='200' group by col1, col2, col3
--Note, MIN() is an aggregate function, so id need not be in the group by
これにより、目的の結果が返されます(id
を使用) ):
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 3 | 2 | some text 1 | 200 |
| 7 | 5 | some text 1 | 200 |
+--------+----------+-------------+-------+
最終的な考え
これがあなたの2つの問題の列でした:
+--------+----------+-------------+-------+
| id | col1 | col2 | col3 |
+--------+----------+-------------+-------+
| 2 | 1 | some text 1 | 200 |
| 8 | 1 | some text 1 | 200 |
+--------+----------+-------------+-------+
これらにぶつかったときはいつでも、各列に何をさせたいかを一度に1つずつ考えてください。 すべてを処理する必要があります グループ化または集計を行うときはいつでも列。
-
id
、id = 2
のみが表示されます 、これはMIN()
です -
co1
、個別の値のみを表示したいので、GROUP BY
-
col2
、個別の値のみを表示したいので、GROUP BY
-
col3
、個別の値のみを表示したいので、GROUP BY