Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Grup Oracle hanya dengan SATU kolom

Komentar panjang di sini;

Ya, Anda tidak bisa melakukan itu. Pikirkanlah... Jika Anda memiliki tabel seperti ini:

Col1 Col2 Col3
A    A    1
B    A    2
C    A    3

Dan Anda mengelompokkan hanya dengan Col2 , yang akan dikelompokkan menjadi satu baris... apa yang terjadi pada Col1 dan Col3 ? Keduanya memiliki 3 nilai baris yang berbeda. Bagaimana seharusnya DBMS Anda menampilkannya?

Col1 Col2 Col3
A?   A    1?
B?        2?
C?        3?

Inilah sebabnya mengapa Anda harus mengelompokkan berdasarkan semua kolom, atau menggabungkan atau menggabungkannya. (SUM() ,MAX() , MIN() , dll..)

Tunjukkan kepada kami bagaimana Anda ingin hasilnya terlihat dan saya yakin kami dapat membantu Anda.

Edit - Jawaban:

Pertama, terima kasih telah memperbarui pertanyaan Anda. Kueri Anda tidak memiliki id tetapi hasil yang Anda harapkan, jadi saya akan menjawab masing-masing secara terpisah.

Tanpa id

Anda masih perlu mengelompokkan menurut semua kolom untuk mencapai apa yang Anda tuju. Mari kita berjalan melewatinya.

Jika Anda menjalankan kueri tanpa grup apa pun dengan:

select col1, col2, col3 from table where col3='200'

Anda akan mendapatkan ini kembali:

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   |
| 5        | some text 1 | 200   |
| 1        | some text 1 | 200   |
+----------+-------------+-------+

Jadi sekarang Anda hanya ingin melihat col1 = 1 baris sekali. Tetapi untuk melakukannya, Anda perlu menggulung semua dari kolom ke atas, sehingga DBMS Anda tahu apa yang harus dilakukan dengan masing-masing kolom. Jika Anda mencoba mengelompokkan hanya dengan col1 , Anda DBMS akan mengalami kesalahan karena Anda tidak memberi tahu apa yang harus dilakukan dengan data tambahan di col2 dan 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?  |
+----------+-------------+-------+

Jika Anda mengelompokkan ketiganya, DBMS Anda tahu untuk mengelompokkan seluruh baris (yang Anda inginkan), dan hanya akan menampilkan baris duplikat satu kali:

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   |
+----------+-------------+-------+

Dengan id

Jika Anda ingin melihat id , Anda harus memberi tahu DBMS Anda yang id menampilkan. Meskipun kami mengelompokkan berdasarkan semua kolom, Anda tidak akan mendapatkan hasil yang diinginkan, karena id kolom akan membuat setiap baris berbeda (Mereka tidak akan lagi dikelompokkan bersama):

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
+--------+----------+-------------+-------+

Jadi untuk mengelompokkan baris ini, kita perlu secara eksplisit mengatakan apa yang harus dilakukan dengan id s. Berdasarkan hasil yang Anda inginkan, Anda ingin memilih id = 2 , yang merupakan minimum id , jadi mari kita gunakan 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

Yang mengembalikan hasil yang Anda inginkan (dengan id ):

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 3      | 2        | some text 1 | 200   |
| 7      | 5        | some text 1 | 200   |
+--------+----------+-------------+-------+

Pemikiran terakhir

Inilah dua baris masalah Anda:

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 8      | 1        | some text 1 | 200   |
+--------+----------+-------------+-------+

Setiap kali Anda menekan ini, pikirkan saja apa yang Anda inginkan untuk dilakukan setiap kolom, satu per satu. Anda harus menangani semua kolom setiap kali Anda melakukan pengelompokan atau agregat.

  • id , Anda hanya ingin melihat id = 2 , yang merupakan MIN()
  • co1 , Anda hanya ingin melihat nilai yang berbeda, jadi GROUP BY
  • col2 , Anda hanya ingin melihat nilai yang berbeda, jadi GROUP BY
  • col3 , Anda hanya ingin melihat nilai yang berbeda, jadi GROUP BY


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tanggal ditambahkan dan tanggal modifikasi untuk audit tabel Oracle

  2. Mengapa pembaruan JDBC saya tidak berfungsi?

  3. Perbandingan tanggal mengembalikan hasil yang tidak biasa - SQL Oracle

  4. Bagaimana saya bisa menghindari kesalahan panjang variabel mentah yang terlalu panjang di SQL Developer?

  5. Fungsi agregat Oracle untuk mengembalikan nilai acak untuk grup?