sql >> Databasteknik >  >> RDS >> Oracle

Oracle grupperar endast med EN kolumn

Lång kommentar här;

Ja, det kan du inte göra. Tänk på det... Om du har ett sådant bord:

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

Och du grupperar endast efter Col2 , som kommer att gruppera ner till en enda rad... vad händer med Col1 och Col3 ? Båda dessa har tre distinkta radvärden. Hur ska ditt DBMS visa dessa?

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

Det är därför du måste gruppera efter alla kolumner, eller på annat sätt aggregera eller sammanfoga dem. (SUM() ,MAX() , MIN() , etc..)

Visa oss hur du vill att resultaten ska se ut och jag är säker på att vi kan hjälpa dig.

Redigera - Svar:

Först och främst, tack för att du uppdaterade din fråga. Din fråga har inte id men dina förväntade resultat gör det, så jag kommer att svara för varje separat.

Utan id

Du måste fortfarande gruppera efter alla kolumner för att uppnå det du vill. Låt oss gå igenom det.

Om du kör din fråga utan någon grupp av:

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

Du får detta tillbaka:

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

Så nu vill du bara se col1 = 1 rad en gång. Men för att göra det måste du rulla alla av kolumnerna upp, så att din DBMS vet vad du ska göra med var och en av dem. Om du försöker gruppera efter endast col1 , kommer din DBMS att gå igenom ett fel eftersom du inte berättade vad den ska göra med extra data i col2 och 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?  |
+----------+-------------+-------+

Om du grupperar efter alla 3, vet din DBMS att gruppera hela raderna (vilket är vad du vill), och kommer bara att visa dubbletter av rader en gång:

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

Med id

Om du vill se id , måste du tala om för ditt DBMS vilket id att visa. Även om vi grupperar efter alla kolumner får du inte önskat resultat, eftersom id kolumnen kommer att göra varje rad distinkt (De kommer inte längre att grupperas):

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

Så för att gruppera dessa rader måste vi uttryckligen säga vad vi ska göra med id s. Baserat på dina önskade resultat vill du välja id = 2 , vilket är minsta id , så låt oss använda 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

Vilket returnerar dina önskade resultat (med id ):

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

Avslutande tanke

Här var dina två problemrader:

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

Varje gång du träffar dessa, tänk bara på vad du vill att varje kolumn ska göra, en i taget. Du måste hantera alla kolumner varje gång du grupperar eller sammanställer.

  • id , vill du bara se id = 2 , vilket är MIN()
  • co1 , vill du bara se distinkta värden, så GROUP BY
  • col2 , vill du bara se distinkta värden, så GROUP BY
  • col3 , vill du bara se distinkta värden, så GROUP BY


  1. Hur lagrar man resultatet av en funktion som returnerar sysrefcursor?

  2. Är det möjligt att fråga en kommaseparerad kolumn för ett specifikt värde?

  3. MySQL - Gruppera efter med Order by DESC

  4. Uppdatera satsen med hjälp av en WHERE-sats som innehåller kolumner med null-värden