Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Grupuj Oracle tylko przez JEDNĄ kolumnę

Długi komentarz tutaj;

Tak, nie możesz tego zrobić. Pomyśl o tym... Jeśli masz taki stół:

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

A grupujesz tylko według Col2 , który zgrupuje się w jednym wierszu... co się stanie z Col1 i Col3 ? Oba mają 3 różne wartości wierszy. Jak Twój DBMS ma je wyświetlać?

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

Dlatego musisz grupować według wszystkich kolumn lub w inny sposób je agregować lub łączyć. (SUM() ,MAX() , MIN() itp.)

Pokaż nam, jak chcesz, aby wyglądały wyniki, a na pewno możemy Ci pomóc.

Edytuj – odpowiedź:

Po pierwsze, dziękuję za aktualizację pytania. Twoje zapytanie nie ma id ale twoje oczekiwane wyniki tak, więc odpowiem za każdy z osobna.

Bez id

Nadal będziesz musiał grupować według wszystkich kolumn, aby osiągnąć to, do czego dążysz. Przejdźmy przez to.

Jeśli uruchomisz zapytanie bez żadnej grupy przez:

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

Odzyskasz to:

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

Więc teraz chcesz zobaczyć tylko col1 = 1 wiersz raz. Ale żeby to zrobić, musisz rzucić wszystko kolumn w górę, aby DBMS wiedział, co zrobić z każdą z nich. Jeśli spróbujesz grupować tylko według col1 , DBMS napotka błąd, ponieważ nie powiedziałeś mu, co zrobić z dodatkowymi danymi w col2 i 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?  |
+----------+-------------+-------+

Jeśli grupujesz wszystkie 3, Twój DBMS wie, że grupuje razem całe wiersze (co jest tym, czego chcesz) i wyświetla zduplikowane wiersze tylko raz:

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

Z id

Jeśli chcesz zobaczyć id , będziesz musiał powiedzieć swojemu DBMS, który id wystawić. Nawet jeśli pogrupujemy według wszystkich kolumn, nie uzyskasz pożądanych wyników, ponieważ id kolumna sprawi, że każdy wiersz będzie inny (nie będą się już grupować):

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

Aby więc pogrupować te wiersze, musimy wyraźnie powiedzieć, co zrobić z id s. Na podstawie żądanych wyników chcesz wybrać id = 2 , czyli minimum id , więc użyjmy 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

Który zwraca pożądane wyniki (z id ):

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

Ostateczna myśl

Oto twoje dwa wiersze problemów:

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

Za każdym razem, gdy je trafisz, pomyśl tylko, co chcesz zrobić w każdej kolumnie, pojedynczo. Będziesz musiał obsłużyć wszystko kolumny za każdym razem, gdy grupujesz lub agregujesz.

  • id , chcesz zobaczyć tylko id = 2 , czyli MIN()
  • co1 , chcesz widzieć tylko różne wartości, więc GROUP BY
  • col2 , chcesz widzieć tylko różne wartości, więc GROUP BY
  • col3 , chcesz widzieć tylko różne wartości, więc 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. Adnotacja Seam @Transactional nie działa?

  2. Jak znaleźć projekt podrzędny projektu nadrzędnego, który jest przekazywany w klauzuli „WHERE”, a także znaleźć zduplikowane obiekty

  3. Czego powinienem użyć zamiast sekwencji, aby uniknąć luk?

  4. Niejednoznaczność w połączeniach lewych (tylko wyrocznia?)

  5. Nie można znaleźć nazwy typu lub przestrzeni nazw „oracle” błąd