복붙노트

[SQL] 이유는 HAVING 절에 집계 별칭을 사용할 수 없습니다?

SQL

이유는 HAVING 절에 집계 별칭을 사용할 수 없습니다?

아래 그림처럼 내 코드는 다음과 같습니다

select col1,count(col2) as col7
from --some join operation
group by col1
having col7 >= 3 -- replace col7 by count(col2) to make the code work

내 코드는 오류 "잘못된 열 이름 'col7'을 '이 발생합니다. 왜 이런 일이 발생합니까? SQL이 날 마지막 줄에 col7을 사용하는 것을 허용하지 않습니다 비논리적 보인다.

나는 2008을 표현하는 SQL 서버를 사용하고 있습니다

해결법

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

    1.MS SQL, 유일한 장소에서 당신은 ORDER BY 절에서 별칭입니다 참조 할 수 있음 (나는 알고 있어요). 쿼리의 다른 부분에서 참조 별명 할 수있는 능력은 많은 다른 DB 플랫폼이 가지고있는 기능이며 정직 마이크로 소프트가 추가 할 수있는 유용한 충분한 기능을 고려하지 않았 음을 날 귀찮게.

    MS SQL, 유일한 장소에서 당신은 ORDER BY 절에서 별칭입니다 참조 할 수 있음 (나는 알고 있어요). 쿼리의 다른 부분에서 참조 별명 할 수있는 능력은 많은 다른 DB 플랫폼이 가지고있는 기능이며 정직 마이크로 소프트가 추가 할 수있는 유용한 충분한 기능을 고려하지 않았 음을 날 귀찮게.

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

    2.HAVING 절은 SELECT 전에 평가 - 서버가 아직 별칭에 대해 알고하지 않도록.

    HAVING 절은 SELECT 전에 평가 - 서버가 아직 별칭에 대해 알고하지 않도록.

    이 질문에 대한 답변이 되었기를 바랍니다. 별명은 ORDER BY 절에서 작동하는 이유 또한, 설명합니다.

  3. ==============================

    3.선택 목록은 또한 HAVING 절에서 사용할 수있는 동일한 표현이 들어 있으므로이 하나를 시도하십시오 :

    선택 목록은 또한 HAVING 절에서 사용할 수있는 동일한 표현이 들어 있으므로이 하나를 시도하십시오 :

    SELECT COL1,COUNT(COL2) AS COL7
    FROM --SOME JOIN OPERATION
    GROUP BY COL1
    HAVING COUNT(COL2) >= 3 
    
  4. ==============================

    4.당신은 COUNT () 열을 사용하여 두 번 선택해야합니다

    당신은 COUNT () 열을 사용하여 두 번 선택해야합니다

    select * from (select col1,count(col2) as col7
    from --some join operation
    group by col1) as temp
    where temp.col7 >= 3
    
  5. ==============================

    5.U이 코드를 사용할 수 있습니다 :

    U이 코드를 사용할 수 있습니다 :

    IF OBJECT_ID('tempdb..#temp') is not null DROP TABLE #temp
    
    -- Create tempurary table
    CREATE TABLE #temp (Id BIGINT IDENTITY(1,1), col1 BIGINT, countOfcol2 BIGIN)
    
    --insert from the table 2 #temp
    INSERT INTO #temp (col1,countOfcol2) 
    
    select col1,count(col2) as col7
    from --some join operation
    
    select col1,countOfcol2 from #temp
    group by col1
    having countOfcol2 >= 3 -- replace col7 by count(col2) to make the code work
    
  6. ==============================

    6.당신은 중첩 된 쿼리를 사용하여이 문제를 해결할 수 있습니다.

    당신은 중첩 된 쿼리를 사용하여이 문제를 해결할 수 있습니다.

    나는 또한 성능을 개선하고자하고이 문제로 실행했다. 나는 테이블의 JSON 필드 내의 특정 필드를 기반으로 카운트 ()를 실행하는 데 필요한 한, 분명히 우리는 (같은 특히 비용을 절을 A의 별도의 수를 포함하는 경우 또는이 필요없이 한 번만 대신 JSON을 구문 분석 할 것 나의 경우에는).

    COL1은 고유 ID 인 경우, 가장 효율적인 계산 방법은 둥지에 별도의 선택의 수가 될 수있다

    select col1, innerquery.col7
    from whatevertable
    inner join (select col1, count(col2) as col7 
                from whatevertable 
                group by col1) as innerquery 
                on innerquery.col1 = whatevertable.col1
    where innerquery.col7 >= 3;
    

    이 방법 카운트 쿼리의 나머지 부분에 의해 참조 임시 조회 테이블의 종류를 생성, 한 번 실행 전용입니다.

    COL1은 일반적으로 대부분의 테이블 ID를 기본 키의 일종이 있기 때문에 무리한 요구하지 않습니다 모든 레코드에 대한 고유 한 경우 다시, 이것은에만 작동합니다.

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

    7.선택 COL1, col7으로 계산 (COL2) --some은 조인 작업에서 COL1에 의해 그룹 (COL2) 카운트를 갖는> = 3;

    선택 COL1, col7으로 계산 (COL2) --some은 조인 작업에서 COL1에 의해 그룹 (COL2) 카운트를 갖는> = 3;

    솔직히 저는 SQL Server가 열 별칭을 처리하지 않는 이유에 느냐고 묻는 사람입니다. 나는 해결 방법으로 사용합니다. 그것은 여전히 ​​원래 집계 함수를 사용하여 별칭하지만, 프로세스 등의 열 이름을 인쇄합니다.

  8. from https://stackoverflow.com/questions/14048672/why-cant-i-use-an-alias-for-an-aggregate-in-a-having-clause by cc-by-sa and MIT license