sql >> Database >  >> RDS >> Oracle

Oracle groeperen op slechts ÉÉN kolom

Lange reactie hier;

Ja, dat kan je niet doen. Denk er eens over na... Als je zo'n tafel hebt:

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

En je groepeert alleen op Col2 , die wordt gegroepeerd tot een enkele rij... wat gebeurt er met Col1 en Col3 ? Beide hebben 3 verschillende rijwaarden. Hoe moet uw DBMS deze weergeven?

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

Daarom moet u op alle kolommen groeperen, of ze op een andere manier aggregeren of samenvoegen. (SUM() ,MAX() , MIN() , enz..)

Laat ons zien hoe u wilt dat de resultaten eruitzien en ik weet zeker dat we u kunnen helpen.

Bewerken - Antwoord:

Allereerst bedankt voor het updaten van je vraag. Uw zoekopdracht heeft geen id maar uw verwachte resultaten doen dat, dus ik zal voor elk afzonderlijk antwoorden.

Zonder id

U moet nog steeds op alle kolommen groeperen om te bereiken waar u voor gaat. Laten we er doorheen lopen.

Als u uw zoekopdracht zonder enige groep uitvoert op:

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

Je krijgt dit terug:

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

Dus nu wil je alleen de col1 = 1 . zien rij eens. Maar om dit te doen, moet je alles . gooien van de kolommen omhoog, zodat uw DBMS weet wat ze met elk ervan moeten doen. Als u probeert te groeperen op alleen col1 , zal je DBMS door een fout gaan omdat je het niet hebt verteld wat het moet doen met de extra gegevens in col2 en 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?  |
+----------+-------------+-------+

Als u groepeert op alle 3, weet uw DBMS de volledige rijen te groeperen (wat u wilt), en zal het dubbele rijen slechts één keer weergeven:

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

Met id

Als je id . wilt zien , moet u uw DBMS vertellen welke id weergeven. Zelfs als we groeperen op alle kolommen, krijgt u niet de gewenste resultaten, omdat de id kolom zal elke rij onderscheiden (ze zullen niet langer bij elkaar worden gegroepeerd):

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

Dus om deze rijen te groeperen, moeten we expliciet zeggen wat we moeten doen met de id s. Op basis van uw gewenste resultaten, wilt u id = 2 . kiezen , wat het minimum . is id , dus laten we MIN() . gebruiken :

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

Wat de gewenste resultaten oplevert (met id ):

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

Laatste gedachte

Dit waren je twee probleemrijen:

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

Telkens wanneer u deze raakt, bedenk dan wat u wilt dat elke kolom één voor één doet. U moet alles afhandelen kolommen elke keer dat u groepeert of aggregeert.

  • id , je wilt alleen id = 2 . zien , wat de MIN() . is
  • co1 , je wilt alleen afzonderlijke waarden zien, dus GROUP BY
  • col2 , je wilt alleen afzonderlijke waarden zien, dus GROUP BY
  • col3 , je wilt alleen afzonderlijke waarden zien, dus GROUP BY


  1. Voer uitgestelde trigger slechts één keer per rij uit in PostgreSQL

  2. Hoe expressie in select-statement in Postgres te evalueren

  3. Index viel buiten de grenzen van de array

  4. Host 'hostname' is geblokkeerd vanwege veel verbindingsfouten; deblokkeren met 'mysqladmin flush-hosts'