복붙노트

[SQL] 집계 함수없이 GROUP BY

SQL

집계 함수없이 GROUP BY

나는 집계 함수없이 (오라클 DBMS에 새로운) GROUP BY를 이해하려고 노력하고 있습니다. 그것은 어떻게 작동 하는가? 여기에 내가 시도하는 것이다.

난 내 SQL을 실행하는 EMP 테이블.

SELECT ename , sal
FROM emp
GROUP BY ename , sal

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

그래서, 열 기본적으로 번호가 GROUP BY 절에서 컬럼의 수와 동일해야하지만, 난 여전히 이유를 이해하지 못하거나 무슨 일이 일어나고 있는지.

해결법

  1. ==============================

    1.GROUP BY의 작동 방식 때문이다. 그것은 여러 행을 받아 하나의 행로 바뀝니다. 이 때문에 일부 열 (필드)에 대한 다른 값이 모두 결합 된 행이 무엇을 알고있다. 당신은 당신이 선택하려는 모든 필드에 대한 두 가지 옵션이 있습니다 이유입니다 : 하나는 GROUP BY 절에 포함하거나 시스템이이 분야를 결합하는 방법을 알 수 있도록 집계 함수에서 사용.

    GROUP BY의 작동 방식 때문이다. 그것은 여러 행을 받아 하나의 행로 바뀝니다. 이 때문에 일부 열 (필드)에 대한 다른 값이 모두 결합 된 행이 무엇을 알고있다. 당신은 당신이 선택하려는 모든 필드에 대한 두 가지 옵션이 있습니다 이유입니다 : 하나는 GROUP BY 절에 포함하거나 시스템이이 분야를 결합하는 방법을 알 수 있도록 집계 함수에서 사용.

    예를 들어, 당신이이 테이블이 있다고 가정 해 봅시다 :

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

    당신이 GROUP BY 이름을 말한다면, 어떻게하는 OrderNumber를이 결과에 표시 할 알 수 있습니까? 당신 그러니이 두 행을 초래할 것이다 의해 그룹에 OrderNumber를 포함. 또는, 당신은 OrderNumbers를 처리하는 방법을 보여 집계 함수를 사용합니다. | 예를 들어, 결과를 의미 MAX (OrderNumber를가), 존입니다 2 결과가 존 의미 SUM (OrderNumber를) | 삼.

  2. ==============================

    2.이 데이터를 감안할 때 :

    이 데이터를 감안할 때 :

    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
    

    그래서, 어떤 값이 열 3에 '2'를해야한다 또는 '3'?

    일반적으로 당신을 계산, 예를 들어하여 그룹을 사용합니다 합계 :

    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
    
  3. ==============================

    3.당신은 GROUP BY 절의 엄격한 요구 사항을 경험하고 있습니다. 기능이 있어야하지 절에서 그룹별로 각 열은 하나의 레코드 (합계, 최대, 최소 등)에 매칭 "그룹"에 대한 모든 레코드를 줄이기 위해 적용 하였다.

    당신은 GROUP BY 절의 엄격한 요구 사항을 경험하고 있습니다. 기능이 있어야하지 절에서 그룹별로 각 열은 하나의 레코드 (합계, 최대, 최소 등)에 매칭 "그룹"에 대한 모든 레코드를 줄이기 위해 적용 하였다.

    당신이 GROUP BY 절에있는 모든 쿼리 (선택) 열을 나열하는 경우, 당신은 기본적으로 중복 레코드가 결과 집합에서 제외 할 것을 요청한다. 이것은 또한 결과 집합에 중복 된 행을 제거 SELECT DISTINCT 같은 효과를 제공한다.

  4. ==============================

    4.응집없이 GROUP BY에 대한 유일한 실제 사용 사례 때 선택한 열이 반복 될 수있는 경우에 선택하는 것보다 GROUP BY 이상의 열. 그렇지 않으면 당신은뿐만 아니라 DISTINCT를 사용할 수 있습니다.

    응집없이 GROUP BY에 대한 유일한 실제 사용 사례 때 선택한 열이 반복 될 수있는 경우에 선택하는 것보다 GROUP BY 이상의 열. 그렇지 않으면 당신은뿐만 아니라 DISTINCT를 사용할 수 있습니다.

    다른 RDBMS에서의 모든 비 집계 열이 GROUP BY에 포함 할 것을 요구하지 않는 것을주의 그것의 가치. PostgreSQL의 예를 들어 테이블의 기본 키 열은 그들이 모든 별개의 기본 키 컬럼에 대한 별개의 보장되므로하지 않는 것이 테이블 필요 후 다른 열 BY 그룹에 포함되는 경우. 나는 그것이 많은 경우에 더 컴팩트 한 SQL을 위해 만든 것입니다 오라클이 동일했다는 것을 과거에달라고했습니다.

  5. ==============================

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

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

    이 데이터를 고려한다.

    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.
    

    그룹에 의해 --aggregate

    SELECT
          VAL1,
          COUNT ( * )
    FROM
          DATASET A
    GROUP BY
          VAL1;
    
    VAL1   COUNT(*)
    ---- ----------
    b             1
    a             2
    c             2
    
    3 rows selected.
    

    여러 항목기로 --aggregate하지만 부분 열을 선택

    SELECT
          VAL1,
          COUNT ( * )
    FROM
          DATASET A
    GROUP BY
          VAL1,
          VAL2;
    
    VAL1  
    ---- 
    b             
    c             
    a             
    a             
    
    4 rows selected.
    

    --no 여러 열로 그룹과 집계

    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.
    

    --no 여러 열로 그룹과 집계

    SELECT
          VAL1
    FROM
          DATASET A
    GROUP BY
          VAL1,
          VAL2;
    
        VAL1  
        ---- 
        b
        c
        a
        a
    
        4 rows selected.
    

    당신은 선택 (제외 집계)의 N 열을 가지고, 당신은 N 또는 N + X 열이 있어야합니다

  6. ==============================

    6.당신이 SELECT 절에 약간의 열이있는 경우 여러 행이있는 경우, 어떻게 선택합니까? 그래서 예, SELECT 절에있는 모든 열은이 SELECT 집계 기능을 사용할 수 있습니다, 또한 GROUP BY 절에 있어야합니다 ...

    당신이 SELECT 절에 약간의 열이있는 경우 여러 행이있는 경우, 어떻게 선택합니까? 그래서 예, SELECT 절에있는 모든 열은이 SELECT 집계 기능을 사용할 수 있습니다, 또한 GROUP BY 절에 있어야합니다 ...

    당신은 SELECT 절에없는 GROUP BY 절에 열이 있지만 그렇지 수

  7. ==============================

    7.사용 서브 쿼리 예컨대 :

    사용 서브 쿼리 예컨대 :

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

    또는

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

    8.부가로

    부가로

    올바른 문장이 아니다.

  9. ==============================

    9.난 당신이이 같은 데이터가있는 경우로 그룹을 이해하려는 말했다 알고있다 :

    난 당신이이 같은 데이터가있는 경우로 그룹을 이해하려는 말했다 알고있다 :

    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
    

    그리고 당신은 데이터처럼 보이게하려면 :

    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
    

    너는 사용한다:

    select * from table_name
    order by col-c,colb
    

    나는 이것이 당신이하고자하는 것입니다 생각하기 때문에.

  10. from https://stackoverflow.com/questions/20074562/group-by-without-aggregate-function by cc-by-sa and MIT license