sql >> Database teknologi >  >> RDS >> Oracle

Oracle grupper efter kun EN kolonne

Lang kommentar her;

Ja, det kan du ikke. Tænk over det... Hvis du har sådan et bord:

Col1 Col2 Col3A A 1B A 2C A 3 

Og du grupperer kun efter Col2 , som vil gruppere ned til en enkelt række... hvad sker der med Col1 og Col3 ? Begge disse har 3 forskellige rækkeværdier. Hvordan skal dit DBMS vise dem?

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

Det er derfor, du skal gruppere efter alle kolonner eller på anden måde aggregere eller sammenkæde dem. (SUM() ,MAX() , MIN() osv.)

Vis os, hvordan du vil have resultaterne til at se ud, og jeg er sikker på, at vi kan hjælpe dig.

Rediger - Svar:

Først og fremmest, tak fordi du opdaterede dit spørgsmål. Din forespørgsel har ikke id men det gør dine forventede resultater, så jeg vil svare for hver enkelt.

Uden id

Du skal stadig gruppere efter alle kolonner for at opnå det, du går efter. Lad os gå igennem det.

Hvis du kører din forespørgsel uden nogen gruppe af:

vælg col1, col2, col3 fra tabel hvor col3='200' 

Du får dette tilbage:

+----------+-------------+-------+| col1 | col2 | col3 |+-----------+-------------+-------+| 1 | noget tekst 1 | 200 || 2 | noget tekst 1 | 200 || 5 | noget tekst 1 | 200 || 1 | noget tekst 1 | 200 |+-----------+-------------+------+

Så nu vil du kun se col1 =1 række en gang. Men for at gøre det skal du rulle alle af kolonnerne op, så dit DBMS ved, hvad du skal gøre med hver af dem. Hvis du prøver at gruppere efter kun col1 , vil din DBMS gå igennem en fejl, fordi du ikke fortalte den, hvad den skal gøre med de ekstra data i col2 og col3 :

vælg col1, col2, col3 fra tabel, hvor col3='200' grupperer efter col1 --Errors+----------+------------- +-------+| col1 | col2 | col3 |+-----------+-------------+-------+| 1 | noget tekst 1 | 200 || 2 | noget tekst 1 | 200 || 5 | noget tekst 1 | 200 || ? | noget tekst 1?| 200? |+-----------+-------------+-------+ 

Hvis du grupperer efter alle 3, ved din DBMS at gruppere hele rækkerne (hvilket er, hvad du ønsker), og vil kun vise duplikerede rækker én gang:

vælg col1, col2, col3 fra tabel, hvor col3='200' grupperer efter col1, col2, col3+---------------- -+-------+| col1 | col2 | col3 |+-----------+-------------+-------+| 1 | noget tekst 1 | 200 || 2 | noget tekst 1 | 200 | --Ønskede resultater| 5 | noget tekst 1 | 200 |+-----------+-------------+------+ 

Med id

Hvis du vil se id , bliver du nødt til at fortælle dit DBMS hvilket id at vise. Selvom vi grupperer efter alle kolonner, får du ikke de ønskede resultater, fordi id kolonne vil gøre hver række adskilt (de grupperes ikke længere):

vælg id, col1, col2, col3 fra tabel, hvor col3='200' grupperer efter id, col1, col2, col3+--------+---------- +-------------+-------+| id | col1 | col2 | col3 |+--------+-----------+-------------+------+| 2 | 1 | noget tekst 1 | 200 | --id =2| 3 | 2 | noget tekst 1 | 200 || 7 | 5 | noget tekst 1 | 200 || 8 | 1 | noget tekst 1 | 200 | --id =8+--------+-----------+-------------+------+ 

Så for at gruppere disse rækker, skal vi udtrykkeligt sige, hvad vi skal gøre med id s. Baseret på dine ønskede resultater, vil du vælge id =2 , hvilket er minimum id , så lad os bruge MIN() :

vælg MIN(id), col1, col2, col3 fra tabel, hvor col3='200' grupper efter col1, col2, col3--Bemærk, MIN() er en aggregeret funktion, så id behøver ikke være i gruppen efter 

Hvilket returnerer dine ønskede resultater (med id ):

+--------+-----------+---------+-------+| id | col1 | col2 | col3 |+--------+-----------+-------------+------+| 2 | 1 | noget tekst 1 | 200 || 3 | 2 | noget tekst 1 | 200 || 7 | 5 | noget tekst 1 | 200 |+--------+-----------+-------------+------+

Sidste tanke

Her var dine to problemrækker:

+--------+-----------+---------+-------+| id | col1 | col2 | col3 |+--------+-----------+-------------+------+| 2 | 1 | noget tekst 1 | 200 || 8 | 1 | noget tekst 1 | 200 |+--------+-----------+-------------+------+

Hver gang du rammer disse, skal du bare tænke over, hvad du vil have, at hver kolonne skal gøre, én ad gangen. Du skal håndtere alle kolonner, hver gang du grupperer eller samler.

  • id , vil du kun se id =2 , som er MIN()
  • co1 , vil du kun se distinkte værdier, så GRUPPER EFTER
  • col2 , vil du kun se distinkte værdier, så GRUPPER EFTER
  • col3 , vil du kun se distinkte værdier, så GRUPPER EFTER


  1. Brug af libmysqlclient i multi-threaded applikation

  2. Hvordan åbner man en SDF-fil (SQL Server Compact Edition)?

  3. Skift SQL-databasemistænkt tilstand til normal tilstand med forespørgsel

  4. Hvordan vi kan bruge mysql_affected_rows() i lagret procedure