Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle-Gruppe nur nach EINER Spalte

Langer Kommentar hier;

Ja, das kannst du nicht. Denken Sie darüber nach... Wenn Sie eine Tabelle wie diese haben:

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

Und Sie gruppieren nur nach Col2 , die zu einer einzigen Zeile gruppiert wird ... was mit Col1 passiert und Col3 ? Beide haben 3 unterschiedliche Zeilenwerte. Wie soll Ihr DBMS diese anzeigen?

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

Aus diesem Grund müssen Sie nach allen Spalten gruppieren oder sie auf andere Weise aggregieren oder verketten. (SUM() ,MAX() , MIN() usw.)

Zeigen Sie uns, wie die Ergebnisse aussehen sollen, und ich bin sicher, wir können Ihnen helfen.

Bearbeiten – Antwort:

Zunächst einmal danke, dass Sie Ihre Frage aktualisiert haben. Ihre Abfrage hat keine id aber Ihre erwarteten Ergebnisse tun es, also werde ich für jedes separat antworten.

Ohne id

Sie müssen immer noch nach allen Spalten gruppieren, um das zu erreichen, was Sie anstreben. Lass es uns durchgehen.

Wenn Sie Ihre Abfrage ohne Gruppe ausführen nach:

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

Das bekommst du zurück:

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

Jetzt wollen Sie also nur noch col1 = 1 sehen Reihe einmal. Aber dazu müssen Sie alle würfeln der Spalten nach oben, damit Ihr DBMS weiß, was mit jeder von ihnen zu tun ist. Wenn Sie versuchen, nur nach col1 zu gruppieren , wird Ihr DBMS einen Fehler machen, weil Sie ihm nicht gesagt haben, was es mit den zusätzlichen Daten in col2 machen soll und 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?  |
+----------+-------------+-------+

Wenn Sie nach allen 3 gruppieren, weiß Ihr DBMS, dass es alle Zeilen zusammengruppieren muss (was Sie wollen) und doppelte Zeilen nur einmal anzeigen:

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

Mit id

Wenn Sie id sehen möchten , müssen Sie Ihrem DBMS mitteilen, welche id anzuzeigen. Selbst wenn wir nach allen Spalten gruppieren, erhalten Sie nicht das gewünschte Ergebnis, da die id Spalte wird jede Reihe unterschiedlich machen (Sie werden nicht mehr gruppiert):

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

Um diese Zeilen zu gruppieren, müssen wir also explizit angeben, was mit der id geschehen soll s. Basierend auf Ihren gewünschten Ergebnissen möchten Sie id = 2 wählen , was das Minimum ist id , verwenden wir also 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

Was Ihre gewünschten Ergebnisse zurückgibt (mit id ):

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

Abschließender Gedanke

Hier waren Ihre beiden Problemzeilen:

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

Jedes Mal, wenn Sie diese treffen, denken Sie einfach darüber nach, was jede Spalte tun soll, eine nach der anderen. Sie müssen alle handhaben Spalten, wenn Sie gruppieren oder aggregieren.

  • id , möchten Sie nur id = 2 sehen , das ist MIN()
  • co1 , Sie möchten nur unterschiedliche Werte sehen, also GROUP BY
  • col2 , Sie möchten nur unterschiedliche Werte sehen, also GROUP BY
  • col3 , Sie möchten nur unterschiedliche Werte sehen, also GROUP BY