복붙노트

[SQL] 왜 하나의 SELECT에서 집계 값과 비 집계 값을 혼합 할 수 없습니다?

SQL

왜 하나의 SELECT에서 집계 값과 비 집계 값을 혼합 할 수 없습니다?

난 당신이 SELECT 문에서 하나 개의 집계 함수가있는 경우, 그 문에 다른 모든 값 중 하나를 집계 함수를해야합니다 알고, 또는 GROUP BY 절에 나열된. 그런 경우 이유를 이해하지 않습니다.

만약 내가한다면:

SELECT Name, 'Jones' AS Surname FROM People

나는 얻다:

NAME    SURNAME
Dave    Jones
Susan   Jones
Amy     Jones

그래서, DBMS는 각 행의 값을 가지고, 상기 결과 집합에 대한 단일 값을 첨부 하였다. 괜찮아. 그러나 작동하는 경우, 내가 왜 수행 할 수 없습니다

SELECT Name, COUNT(Name) AS Surname FROM People

그것은 같은 생각입니다, 각 행의 값을 가지고 하나의 값을 추가합니다. 그러나 대신 :

NAME    SURNAME
Dave    3
Susan   3
Amy     3    

나는 얻다:

나는 그것이 허용되지 않는 것을 알고 있지만,이 상황은 내가 이유를 이해하지 않는 것이 너무 비슷한 것 같다. 그것을 구현하는 DBMS 쉽게 있나요? 나는 그것이해야한다고 생각처럼 작동하지 않는 이유는 누군가가 나에게 설명 할 수 있다면, 나는 매우 감사하게 될 거라고.

해결법

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

    1.집계 결과에 그룹에 완전한 결과에, 그들은 단지 일을 작동하지 않습니다.

    집계 결과에 그룹에 완전한 결과에, 그들은 단지 일을 작동하지 않습니다.

    포함하는 테이블을 고려 :

    Person   Pet
    -------- --------
    Amy      Cat
    Amy      Dog
    Amy      Canary
    Dave     Dog
    Susan    Snake
    Susan    Spider
    

    당신은 사람에 대한 그룹, 그것은 다음과 같은 그룹으로 데이터를 분할 할 것을 쿼리를 사용하는 경우 :

    Amy:
      Amy    Cat
      Amy    Dog
      Amy    Canary
    Dave:
      Dave   Dog
    Susan:
      Susan  Snake
      Susan  Spider
    

    당신이 집계를 사용하는 경우, 예를 들어 카운트 집계는 각 그룹에 대한 하나 개의 결과를 생성합니다 :

    Amy:
      Amy    Cat
      Amy    Dog
      Amy    Canary    count(*) = 3
    Dave:
      Dave   Dog       count(*) = 1
    Susan:
      Susan  Snake
      Susan  Spider    count(*) = 2
    

    사람이 당신에게 각 그룹에 대해 하나 개의 레코드를 제공함으로써 그래서 쿼리는 사람들 그룹의 사람, COUNT (*)를 선택합니다 :

    Amy    3
    Dave   1
    Susan  2
    

    각 그룹에 해당 필드에 대해 여러 값이있을 수 있기 때문에 일을하지 않는, 또한 그 결과에 애완 동물 필드를 좀하려고합니다.

    (일부 데이터베이스는 MySQL은 같은, 어쨌든을 허용하지, 그냥 그룹 내에서 어떤 임의의 값을 반환하고, 그 결과가 합리적인지 아닌지 알고 귀하의 책임입니다.)

    당신이 총을 사용하지만, 어떤 그룹을 지정하지 않을 경우, 쿼리는 여전히 그룹화되고, 전체 결과는 하나의 그룹입니다. 사람에서 쿼리 SELECT COUNT (*)는 모든 레코드를 포함하는 단일 그룹을 생성되며, 집계는 해당 그룹의 레코드를 카운트 할 수 있습니다. 그 결과, 각각의 그룹에서 하나 개의 행을 포함하고, 하나의 그룹 만이 존재하는 한, 결과의 한 행이있을 것이다.

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

    2.그것에 대해 이런 식으로 생각 : 당신이 그룹화하지 않고 COUNT를 호출 할 때, 그것은 불가능 SELECT 절에 그룹 내에서 개별 항목에 액세스 할 수있게 하나의 그룹에 테이블을 "붕괴".

    그것에 대해 이런 식으로 생각 : 당신이 그룹화하지 않고 COUNT를 호출 할 때, 그것은 불가능 SELECT 절에 그룹 내에서 개별 항목에 액세스 할 수있게 하나의 그룹에 테이블을 "붕괴".

    당신은 여전히 ​​하위 쿼리를 사용하여 결과를 얻을 수 있습니다 또는 크로스 조인 :

        SELECT p1.Name, COUNT(p2.Name) AS Surname FROM People p1 CROSS JOIN People p2 GROUP BY p1.Name
    
        SELECT Name, (SELECT COUNT(Name) FROM People) AS Surname FROM People
    
  3. ==============================

    3.다른 사람이 설명했듯이 당신이 GROUP BY이 있거나 SELECT 목록에서 COUNT와 같은 집계 함수 ()를 사용하는 경우, 당신은 행으로 그룹화 때문에 모든 그룹에 대한 하나에 일치하는 행을 축소하고있다.

    다른 사람이 설명했듯이 당신이 GROUP BY이 있거나 SELECT 목록에서 COUNT와 같은 집계 함수 ()를 사용하는 경우, 당신은 행으로 그룹화 때문에 모든 그룹에 대한 하나에 일치하는 행을 축소하고있다.

    당신은 단지 GROUP BY없이 SELECT 목록에 집계 함수를 사용할 때 BY 1 그룹이 모든 행이 하나에 붕괴, 그룹화, 그래서 그것을 생각. 당신이 백 개 행이있는 경우 그 중 백 있기 때문에 그래서, 데이터베이스 정말 당신의 이름을 표시 할 수 없습니다.

    그러나 함수 "윈도"한 RDBMS를 들어, 당신이 원하는 가능하다. 예를 들면 BY 그룹없이 집계 함수를 사용합니다.

    테이블의 모든 행 (이름)이 계산됩니다 SQL-서버의 예 :

    SELECT Name
         , COUNT(*) OVER() AS cnt
    FROM People
    

    어떻게 위의 작동합니까?

    또 다른 예. 당신이 테이블에 성 필드가있는 경우, 당신은 같은 성을 가지고 얼마나 많은 사람들이 성 및 계산에 의해 그룹화 된 모든 행을 표시하려면이 같은 것을 할 수 있습니다 :

    SELECT Name
         , Surname
         , COUNT(*) OVER(PARTITION BY Surname) AS cnt
    FROM People
    
  4. ==============================

    4.귀하의 질의는 암시 적 결과 집합의 행의 다른 유형을 요구, 그것은 허용되지 않습니다. 반환 된 모든 행은 동일한 유형이어야과 열 같은 종류의를 가져야한다.

    귀하의 질의는 암시 적 결과 집합의 행의 다른 유형을 요구, 그것은 허용되지 않습니다. 반환 된 모든 행은 동일한 유형이어야과 열 같은 종류의를 가져야한다.

    'SELECT 이름, 성 (姓)은'반환에 테이블의 모든 행에 대한 행을 원한다.

    'SELECT COUNT (*)는 "테이블의 모든 행의 결과를 결합하는 하나의 행을 리턴 원한다.

    나는이 경우 데이터베이스가 그럴듯 단지 두 쿼리를 할 수는있는 거 올바른 생각하고 모든 결과에 'SELECT COUNT (*)'의 결과를 복사합니다. 이 일을하지 않는 이유 중 하나는 스텔스 성능 저하 될 것입니다 : 당신은 효과적으로 여분의 자기를 조인하고있을 것 어디를 선언하지 않고.

    다른 답변은 내가 그로 이동하지 않도록,이 쿼리의 작업 버전을 작성하는 방법을 설명했다.

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

    5.집계 함수와 GROUP BY 절은 쿼리에 다른 장소에 나타납니다 같은 일의 일부있어, 별도의 일이 아니다. 당신이 열을 집계 할 경우, 당신은 집계에 사용하는 기능을 무슨 말을해야합니다 당신이 집계 함수를 원하는 경우, 일부 컬럼을 통해 적용 할 수있다.

    집계 함수와 GROUP BY 절은 쿼리에 다른 장소에 나타납니다 같은 일의 일부있어, 별도의 일이 아니다. 당신이 열을 집계 할 경우, 당신은 집계에 사용하는 기능을 무슨 말을해야합니다 당신이 집계 함수를 원하는 경우, 일부 컬럼을 통해 적용 할 수있다.

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

    6.집계 기능은 특정 조건에 복수 행의 값을 취하고 하나 개의 값으로 이들을 결합한다. 이 조건은 명세서 BYin 그룹이 정의된다. 당신은 그룹 BY없이 집계 기능을 사용할 수 없습니다 그래서

    집계 기능은 특정 조건에 복수 행의 값을 취하고 하나 개의 값으로 이들을 결합한다. 이 조건은 명세서 BYin 그룹이 정의된다. 당신은 그룹 BY없이 집계 기능을 사용할 수 없습니다 그래서

    SELECT Name, 'Jones' AS Surname FROM People  
    

    당신은 간단하지만,와 ... 고정 된 값을 갖는 추가 열을 선택

    SELECT Name, COUNT(Name) AS Surname FROM People GROUP BY Name
    

    당신은 모든 이름이 표에 발생하는 빈도를 기억하고 하나의 행로 축소 이름을 선택 DBMS를 말한다. 당신이 DBMS에 의해 그룹을 생략하면 그래서 기록을 축소하는 방법, 말할 수 없다

  7. from https://stackoverflow.com/questions/5920070/why-cant-you-mix-aggregate-values-and-non-aggregate-values-in-a-single-select by cc-by-sa and MIT license