Oracle
 sql >> база данни >  >> RDS >> Oracle

Групирайте Oracle само по ЕДНА колона

Дълъг коментар тук;

Да, не можеш да направиш това. Помислете за това... Ако имате такава таблица:

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

И вие групирате само по Col2 , което ще групира до един ред... какво се случва с Col1 и Col3 ? И двете имат 3 отделни стойности на редове. Как вашата СУБД трябва да ги показва?

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

Ето защо трябва да групирате по всички колони или по друг начин да ги обобщите или свържете. (SUM() ,MAX() , MIN() и т.н.)

Покажете ни как искате да изглеждат резултатите и съм сигурен, че можем да ви помогнем.

Редактиране - Отговор:

Първо, благодаря, че актуализирахте въпроса си. Вашата заявка няма id но вашите очаквани резултати са, така че ще отговоря за всеки поотделно.

Без id

Все пак ще трябва да групирате по всички колони, за да постигнете това, към което се стремите. Нека преминем през него.

Ако изпълните заявката си без групиране по:

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

Ще получите това обратно:

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

Така че сега искате да видите само col1 = 1 гребете веднъж. Но за да направите това, трябва да превъртите всички от колоните нагоре, така че вашата СУБД знае какво да прави с всяка от тях. Ако се опитате да групирате само по col1 , вашата СУБД ще премине през грешка, защото не сте й казали какво да прави с допълнителните данни в col2 и 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?  |
+----------+-------------+-------+

Ако групирате по всички 3, вашата СУБД знае да групира заедно целите редове (което е, което искате), и ще покаже дублиращи се редове само веднъж:

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

С id

Ако искате да видите id , ще трябва да кажете на вашата СУБД кой id за показване. Дори ако групираме по всички колони, няма да получите желаните резултати, защото id ще направи всеки ред различен (те вече няма да се групират заедно):

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

Така че, за да групираме тези редове, трябва изрично да кажем какво да правим с id с. Въз основа на желаните резултати искате да изберете id = 2 , което е минимумът id , така че нека използваме 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

Което връща желаните от вас резултати (с id ):

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

Последна мисъл

Ето вашите два реда проблеми:

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

Всеки път, когато ги ударите, просто помислете какво искате да прави всяка колона, една по една. Ще трябва да се справите с всички колони всеки път, когато правите групиране или обобщаване.

  • id , искате да видите само id = 2 , което е MIN()
  • co1 , искате да виждате само отделни стойности, така че GROUP BY
  • col2 , искате да виждате само отделни стойности, така че GROUP BY
  • col3 , искате да виждате само отделни стойности, така че GROUP BY


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да получите BLOB данни с помощта на oracle ODBC

  2. Изчисляване на средната цена на инвентара в SQL

  3. Стойността, вмъкната в таблицата в Oracle, не е запазена?

  4. Въпроси за Oracle DBA в реално време

  5. Хибернация Timestamp с часова зона