복붙노트

[SQL] 당신은 GROUP BY는 CASE THEN 별칭 이름으로 할 수 있습니까?

SQL

당신은 GROUP BY는 CASE THEN 별칭 이름으로 할 수 있습니까?

나는 '길이'로 별명 THEN 상태 (문이 경우 또는 여러 사용할 수 있습니다) 때 SELECT 문이 CASE 계산되고 있고, 나는 결과를 함께 제대로 GROUP해야합니다. 선택은 작동하는 것 같군,하지만 그룹 그룹화 잘못. 여기 내 문은 다음과 같습니다

SELECT CASE 
    WHEN DATEDIFF(o.EndDate, o.StartDate) < 30 THEN '<1 Month'
    WHEN DATEDIFF(o.EndDate, o.StartDate) < 90 THEN '1 - 2 Months'
    WHEN DATEDIFF(o.EndDate, o.StartDate) < 210 THEN '3 - 4 Months'
    ELSE '>4 Months' END AS 'Length', 
    COUNT(DISTINCT(person.ID)) AS 'COUNT'
FROM person
    INNER JOIN opportunity AS o
    INNER JOIN Organization AS org
    ON person.EntityID = o.id 
        AND O.OrganizationID = Org.ID
WHERE person.TitleID = 2
    AND o.bID = 1
GROUP BY 'Length'
ORDER BY 'Length' ASC;

이 그룹으로 모든 결과 - 옳지 않다 '3 ~ 4 개월'..

해결법

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

    1.당신은 당신이 하위 쿼리에 싸서하지 않는 경우 GROUP BY 절에 전체 CASE 문을 사용해야합니다.

    당신은 당신이 하위 쿼리에 싸서하지 않는 경우 GROUP BY 절에 전체 CASE 문을 사용해야합니다.

    SELECT  CASE 
                WHEN DATEDIFF(o.EndDate, o.StartDate) < 30 THEN '<1 Month'
                WHEN DATEDIFF(o.EndDate, o.StartDate) < 90 THEN '1 - 2 Months'
                WHEN DATEDIFF(o.EndDate, o.StartDate) < 210 THEN '3 - 4 Months'
                ELSE '>4 Months' 
            END AS `Length`, 
            COUNT(DISTINCT(person.ID)) AS `COUNT`
    FROM    person
            INNER JOIN opportunity AS o
                ON person.EntityID = o.id
            INNER JOIN Organization AS org
                ON o.OrganizationID = Org.ID
    WHERE   person.TitleID = 2
            AND o.bID = 1
    GROUP   BY  CASE 
                    WHEN DATEDIFF(o.EndDate, o.StartDate) < 30 THEN '<1 Month'
                    WHEN DATEDIFF(o.EndDate, o.StartDate) < 90 THEN '1 - 2 Months'
                    WHEN DATEDIFF(o.EndDate, o.StartDate) < 210 THEN '3 - 4 Months'
                    ELSE '>4 Months' 
                END
    ORDER   BY Length ASC;
    

    ORDER BY 절에서도 열 이름 주위에 따옴표를 제거합니다.

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

    2.나는 정확히 같은 문제로 고민하고 여기에 내가 생각 해낸 해결책은 다음과 같습니다

    나는 정확히 같은 문제로 고민하고 여기에 내가 생각 해낸 해결책은 다음과 같습니다

    SELECT CASE 
    WHEN DATEDIFF(o.EndDate, o.StartDate) < 30 THEN '<1 Month'
    WHEN DATEDIFF(o.EndDate, o.StartDate) < 90 THEN '1 - 2 Months'
    WHEN DATEDIFF(o.EndDate, o.StartDate) < 210 THEN '3 - 4 Months'
    ELSE '>4 Months' END AS `Length`, 
    COUNT(DISTINCT(person.ID)) AS `COUNT`
    FROM person
    INNER JOIN opportunity AS o
    INNER JOIN Organization AS org
    ON person.EntityID = o.id 
        AND O.OrganizationID = Org.ID
    WHERE person.TitleID = 2
    AND o.bID = 1
    GROUP BY `Length`
    ORDER BY `Length` ASC;
    
  3. from https://stackoverflow.com/questions/19096344/can-you-group-by-with-a-case-when-then-alias-name by cc-by-sa and MIT license