sql >> Databáze >  >> RDS >> Oracle

Skupina Oracle pouze o JEDEN sloupec

Dlouhý komentář zde;

Jo, to nemůžeš. Přemýšlejte o tom... Pokud máte takový stůl:

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

A seskupujete pouze podle Col2 , který se seskupí do jednoho řádku... co se stane s Col1 a Col3 ? Oba mají 3 různé hodnoty řádků. Jak je má váš DBMS zobrazovat?

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

To je důvod, proč musíte seskupit podle všech sloupců nebo je jinak agregovat nebo zřetězit. (SUM() ,MAX() , MIN() , atd..)

Ukažte nám, jak chcete, aby výsledky vypadaly, a jsem si jistý, že vám můžeme pomoci.

Upravit – odpověď:

Předem děkuji za aktualizaci vašeho dotazu. Váš dotaz nemá id ale vaše očekávané výsledky ano, takže odpovím pro každého zvlášť.

Bez id

Stále budete muset seskupit podle všech sloupců, abyste dosáhli toho, co chcete. Pojďme si to projít.

Pokud spustíte dotaz bez jakékoli skupiny pomocí:

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

Toto dostanete zpět:

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

Nyní tedy chcete vidět pouze col1 = 1 řádek jednou. Chcete-li to však provést, musíte hodit vše sloupců nahoru, takže váš DBMS ví, co s každým z nich dělat. Pokud se pokusíte seskupit pouze podle col1 , váš DBMS projde chybou, protože jste mu neřekli, co má dělat s dodatečnými daty v col2 a 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?  |
+----------+-------------+-------+

Pokud seskupíte podle všech 3, váš DBMS ví, že má seskupit celé řádky (což je to, co chcete) a duplicitní řádky zobrazí pouze jednou:

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

S id

Pokud chcete vidět id , budete muset svému DBMS sdělit, které id zobrazit. I když seskupíme podle všech sloupců, nedosáhnete požadovaných výsledků, protože id sloupec bude rozlišovat každý řádek (už se nebudou seskupovat):

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

Abychom tedy mohli tyto řádky seskupit, musíme výslovně říci, co dělat s id s. Na základě požadovaných výsledků chcete zvolit id = 2 , což je minimum id , takže použijeme 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

Což vrátí požadované výsledky (s id ):

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

Poslední myšlenka

Zde byly vaše dva problémy:

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

Kdykoli na ně narazíte, přemýšlejte o tom, co chcete, aby jednotlivé sloupce dělaly, jeden po druhém. Budete muset zvládnout vše sloupce, kdykoli provedete seskupení nebo agregaci.

  • id , chcete vidět pouze id = 2 , což je MIN()
  • co1 , chcete vidět pouze odlišné hodnoty, takže GROUP BY
  • col2 , chcete vidět pouze odlišné hodnoty, takže GROUP BY
  • col3 , chcete vidět pouze odlišné hodnoty, takže GROUP BY


  1. Lomítko nebo žádné lomítko?

  2. Výkon Mysql Query. který je nejlepší?

  3. Různé výsledky pomocí stejného dotazu s DB::raw a Eloquent

  4. Jak mohu vytvořit dynamickou klauzuli WHERE?