IT Share you

집계 함수가없는 GROUP BY

shareyou 2020. 12. 6. 22:20
반응형

집계 함수가없는 GROUP BY


집계 함수없이 GROUP BY (오라클 dbms의 새로운 기능 ) 를 이해하려고 합니다.
어떻게 작동합니까?
여기 내가 시도한 것입니다.

SQL을 실행할 EMP 테이블입니다.
EMP 표

SELECT ename , sal
FROM emp
GROUP BY ename , sal

결과

SELECT ename , sal  
FROM emp  
GROUP BY ename;  

결과

ORA-00979 : GROUP BY 표현식
00979가 아닙니다. 00000- "GROUP BY 표현식이 아닙니다"
* Cause :
* Action :
라인 오류 : 397 컬럼 : 16

SELECT ename , sal  
FROM emp  
GROUP BY sal;  

결과

ORA-00979 : GROUP BY 표현식
00979가 아닙니다. 00000- "GROUP BY 표현식이 아닙니다"
* Cause :
* Action : 라인 오류 : 411 컬럼 : 8

SELECT empno , ename , sal  
FROM emp  
GROUP BY sal , ename;  

결과

ORA-00979 : GROUP BY 표현식
00979가 아닙니다. 00000- "GROUP BY 표현식이 아닙니다"
* Cause :
* Action : 라인 오류 : 425 컬럼 : 8

SELECT empno , ename , sal  
FROM emp  
GROUP BY empno , ename , sal;  

결과

따라서 기본적으로 열의 수는 GROUP BY 절의 열 수와 같아야하지만, 나는 여전히 왜 또는 무슨 일이 일어나고 있는지 이해하지 못합니다.


이것이 GROUP BY가 작동하는 방식입니다. 여러 행을 사용하여 하나의 행으로 바꿉니다. 이 때문에 일부 열 (필드)에 대해 서로 다른 값이있는 모든 결합 된 행에 대해 수행 할 작업을 알아야합니다. 이것이 SELECT하려는 모든 필드에 대해 두 가지 옵션이있는 이유입니다. GROUP BY 절에 포함하거나 집계 함수에서 사용하여 시스템이 필드를 결합하려는 방법을 알 수 있도록합니다.

예를 들어 다음 테이블이 있다고 가정 해 보겠습니다.

Name | OrderNumber
------------------
John | 1
John | 2

GROUP BY Name이라고 말하면 결과에 표시 할 OrderNumber를 어떻게 알 수 있습니까? 따라서 Group by에 OrderNumber를 포함하면이 두 행이 생성됩니다. 또는 집계 함수를 사용하여 OrderNumber를 처리하는 방법을 보여줍니다. 예를 들어 MAX(OrderNumber), 이는 그 결과가 의미 John | 2하거나 SUM(OrderNumber)결과가 의미한다 John | 3.


이 데이터가 주어지면 :

Col1  Col2  Col3
 A     X     1
 A     Y     2
 A     Y     3
 B     X     0
 B     Y     3
 B     Z     1

이 쿼리

SELECT Col1, Col2, Col3 FROM data GROUP BY Col1, Col2, Col3

정확히 동일한 테이블이 생성됩니다.

그러나이 쿼리 :

SELECT Col1, Col2 FROM data GROUP BY Col1, Col2

결과가

Col1  Col2
 A     X  
 A     Y  
 B     X  
 B     Y  
 B     Z  

이제 쿼리 :

SELECT Col1, Col2, Col3 FROM data GROUP BY Col1, Col2

문제를 일으킬 수 있습니다. A, Y가있는 라인은 두 라인을 그룹화 한 결과입니다.

 A     Y     2
 A     Y     3

그렇다면 Col3, '2'또는 '3'에는 어떤 값이 있어야합니까?

일반적으로 합계를 계산하기 위해 그룹 by를 사용합니다.

SELECT Col1, Col2, SUM(Col3) FROM data GROUP BY Col1, Col2

그래서 우리는 이제 (2 + 3) = 5를 얻습니다.

선택 항목의 모든 열을 기준으로 그룹화하는 것은 DISTINCT를 사용하는 것과 사실상 동일하며이 경우 DISTINCT 키워드 단어 가독성을 사용하는 것이 좋습니다.

그래서 대신

SELECT Col1, Col2, Col3 FROM data GROUP BY Col1, Col2, Col3

사용하다

SELECT DINSTINCT Col1, Col2, Col3 FROM data

GROUP BY 절의 엄격한 요구 사항 이 있습니다 . group-by 절에없는 모든 열에는 일치하는 "그룹"에 대한 모든 레코드를 단일 레코드 (합계, 최대, 최소 등)로 줄이는 기능이 적용되어야합니다.

GROUP BY 절에 쿼리 된 (선택된) 모든 열을 나열하는 경우 기본적으로 중복 레코드를 결과 집합에서 제외하도록 요청하는 것입니다. 이는 결과 세트에서 중복 행을 제거하는 SELECT DISTINCT와 동일한 효과를 제공합니다.


집계가없는 GROUP BY의 유일한 실제 사용 사례는 선택한 열보다 더 많은 열을 GROUP BY하는 경우입니다.이 경우 선택한 열이 반복 될 수 있습니다. 그렇지 않으면 DISTINCT를 사용하는 것이 좋습니다.

다른 RDBMS에서는 집계되지 않은 모든 열을 GROUP BY에 포함 할 필요가 없다는 점에 유의할 필요가 있습니다. 예를 들어 PostgreSQL에서 테이블의 기본 키 열이 GROUP BY에 포함 된 경우 해당 테이블의 다른 열은 모든 고유 기본 키 열에 대해 구별 될 수 있으므로 필요하지 않습니다. 나는 과거에 오라클이 많은 경우에 더 간결한 SQL을 위해 만들었던 것과 똑같이 해주기를 바랐습니다.


몇 가지 예를 들어 보겠습니다.

이 데이터를 고려하십시오.

CREATE TABLE DATASET ( VAL1 CHAR ( 1 CHAR ),
                   VAL2 VARCHAR2 ( 10 CHAR ),
                   VAL3 NUMBER );

INSERT INTO
      DATASET ( VAL1, VAL2, VAL3 )
VALUES
      ( 'b', 'b-details', 2 );

INSERT INTO
      DATASET ( VAL1, VAL2, VAL3 )
VALUES
      ( 'a', 'a-details', 1 );

INSERT INTO
      DATASET ( VAL1, VAL2, VAL3 )
VALUES
      ( 'c', 'c-details', 3 );

INSERT INTO
      DATASET ( VAL1, VAL2, VAL3 )
VALUES
      ( 'a', 'dup', 4 );

INSERT INTO
      DATASET ( VAL1, VAL2, VAL3 )
VALUES
      ( 'c', 'c-details', 5 );

COMMIT;

지금 테이블에있는 것

SELECT * FROM DATASET;

VAL1 VAL2             VAL3
---- ---------- ----------
b    b-details           2
a    a-details           1
c    c-details           3
a    dup                 4
c    c-details           5

5 rows selected.

-그룹 별 집계

SELECT
      VAL1,
      COUNT ( * )
FROM
      DATASET A
GROUP BY
      VAL1;

VAL1   COUNT(*)
---- ----------
b             1
a             2
c             2

3 rows selected.

-여러 열별로 그룹화하지만 부분 열 선택

SELECT
      VAL1,
      COUNT ( * )
FROM
      DATASET A
GROUP BY
      VAL1,
      VAL2;

VAL1  
---- 
b             
c             
a             
a             

4 rows selected.

-여러 열로 그룹화 한 집계 없음

SELECT
      VAL1,
      VAL2
FROM
      DATASET A
GROUP BY
      VAL1,
      VAL2;

    VAL1  
    ---- 
    b    b-details
    c    c-details
    a    dup
    a    a-details

    4 rows selected.

-여러 열로 그룹화 한 집계 없음

SELECT
      VAL1
FROM
      DATASET A
GROUP BY
      VAL1,
      VAL2;

    VAL1  
    ---- 
    b
    c
    a
    a

    4 rows selected.

You have N columns in select (excluding aggregations), then you should have N or N+x columns


If you have some column in SELECT clause , how will it select it if there is several rows ? so yes , every column in SELECT clause should be in GROUP BY clause also , you can use aggregate functions in SELECT ...

you can have column in GROUP BY clause which is not in SELECT clause , but not otherwise


Use sub query e.g:

SELECT field1,field2,(SELECT distinct field3 FROM tbl2 WHERE criteria) AS field3
FROM tbl1 GROUP BY field1,field2

OR

SELECT DISTINCT field1,field2,(SELECT distinct field3 FROM tbl2 WHERE criteria) AS field3
FROM tbl1

As an addition

basically the number of columns have to be equal to the number of columns in the GROUP BY clause

is not a correct statement.

  • Any attribute which is not a part of GROUP BY clause can not be used for selection
  • Any attribute which is a part of GROUP BY clause can be used for selection but not mandatory.

I know you said you want to understand group by if you have data like this:

COL-A  COL-B  COL-C  COL-D
  1      Ac      C1     D1
  2      Bd      C2     D2
  3      Ba      C1     D3
  4      Ab      C1     D4
  5      C       C2     D5

And you want to make the data appear like:

COL-A  COL-B  COL-C  COL-D
  4      Ab      C1     D4
  1      Ac      C1     D1
  3      Ba      C1     D3
  2      Bd      C2     D2
  5      C       C2     D5

You use:

select * from table_name
order by col-c,colb

나는 이것이 당신이하려는 일이라고 생각하기 때문입니다.

참고 URL : https://stackoverflow.com/questions/20074562/group-by-without-aggregate-function

반응형