복붙노트

[SQL] ORDER BY 별칭이 작동하지 않습니다

SQL

ORDER BY 별칭이 작동하지 않습니다

질문을 업데이트 :

ERROR:  column "Fruits" does not exist

포스트 그레스 7.4 (그래 우리가 업그레이드) 실행

왜 열 별칭 BY하지 I 주문할 수 있습니까? TOF를 원한다. "TypeOfFruits"는 ORDER BY에서뿐만 아니라, 그 이유는 무엇입니까?

SELECT (CASE
    WHEN tof."TypeOfFruits" = 'A' THEN 'Apple' 
    WHEN tof."TypeOfFruits" = 'P' THEN 'Pear' 
    WHEN tof."TypeOfFruits" = 'G' THEN 'Grapes' 
    ELSE 'Other' END) AS "Fruits",
    SUM(CASE WHEN r.order_date 
        BETWEEN DATE_TRUNC('DAY', LOCALTIMESTAMP) AND DATE_TRUNC('DAY', LOCALTIMESTAMP) + INTERVAL '1 DAY' 
        THEN 1 ELSE 0 END) AS daily, 
    SUM(CASE WHEN r.order_date 
        BETWEEN DATE_TRUNC('MONTH', LOCALTIMESTAMP) AND DATE_TRUNC('MONTH', LOCALTIMESTAMP) + INTERVAL '1 MONTH' 
        THEN 1 ELSE 0 END) AS monthly, 
    SUM(CASE WHEN r.order_date 
        BETWEEN DATE_TRUNC('YEAR', LOCALTIMESTAMP) AND DATE_TRUNC('YEAR', LOCALTIMESTAMP) + INTERVAL '1 YEAR' 
        THEN 1 ELSE 0 END) AS yearly, 
    SUM(CASE WHEN r.order_date >= '01-01-2011 00:00:00' THEN 1 ELSE 0 END) AS lifetime 
FROM reports AS r, "TypeOfFruits" AS tof 
WHERE r.id = tof."ID" 
GROUP BY "Fruits"
ORDER BY CASE 
    WHEN "Fruits" = 'Apple' THEN 1 
    WHEN "Fruits" = 'Pear' THEN 2 
    WHEN "Fruits" = 'Grapes' THEN 3 
    ELSE 4 
END

지금과 같은 결과

Fruits;daily;monthly;yearly;lifetime
"Apple";17;1174;3136;3136
"Pear";28;94;94;94
"Grapes";0;191;490;490
"Other";0;2;27;27
"Other";0;0;1;1
"Other";0;0;27;27
"Other";0;6;28;28
"Other";0;58;229;229
"Other";0;3;3;3
"Other";0;0;1;1

원하는 결과는 이렇게 네 개의 행 모두, "기타"총 한 행을 것 (X는 총 것)

Fruits;daily;monthly;yearly;lifetime
"Apple";17;1174;3136;3136
"Pear";28;94;94;94
"Grapes";0;191;490;490
"Other";x;x;x;x

해결법

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

    1.당신은 "과일"첫 번째 필드에 의해 순서 1에 의해 ORDER를 사용할 수 있습니다. 동일은 GROUP BY 유효

    당신은 "과일"첫 번째 필드에 의해 순서 1에 의해 ORDER를 사용할 수 있습니다. 동일은 GROUP BY 유효

    최신 정보

    주문 내용 대신하여 순서를하는 경우에 새로운 항목을 생성 말하자면 .. .. 제 총수 :

    (CASE 
        WHEN "Fruits" = 'Apple' THEN 1 
        WHEN "Fruits" = 'Pear' THEN 2 
        WHEN "Fruits" = 'Grapes' THEN 3 
        ELSE 4 ) as Order
    

    그럼 당신은이 순서로.

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

    2.그 이유는 문서에서 찾을 수 있습니다 :

    그 이유는 문서에서 찾을 수 있습니다 :

    (내 강조)

    그 이유는 SQL 표준 (SQL-92)의 이전 버전만을 새로운 버전 임의의 식에 의해 분류 할 수있는 반면, 출력 컬럼 이름 또는 번호로 정렬 허용하지만, 이러한 표현은 입력 열 값으로 형성된다는 것이다.

    다른 답변은 이미 귀하의 경우에 적합한 다양한 해결 방법을 포함하고있다.

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

    3.별칭은 당신에 의해 순서대로 사용할 수 없도록 의한 주문 후 지정됩니다. 대신 사용 :

    별칭은 당신에 의해 순서대로 사용할 수 없도록 의한 주문 후 지정됩니다. 대신 사용 :

    (CASE
        WHEN tof."TypeOfFruits" = 'A' THEN 'Apple' 
        WHEN tof."TypeOfFruits" = 'P' THEN 'Pear' 
        WHEN tof."TypeOfFruits" = 'G' THEN 'Grapes' 
        ELSE 'Other' END)
    
  4. ==============================

    4.이런 식으로 뭔가를 고려하십시오

    이런 식으로 뭔가를 고려하십시오

    SELECT * FROM (SELECT (CASE
        WHEN tof."TypeOfFruits" = 'A' THEN 'Apple' 
        WHEN tof."TypeOfFruits" = 'P' THEN 'Pear' 
        WHEN tof."TypeOfFruits" = 'G' THEN 'Grapes' 
        ELSE 'Other' END) AS "Fruits", 
        (CASE 
        WHEN tof."TypeOfFruits" = 'A' THEN 1 
        WHEN tof."TypeOfFruits" = 'P' THEN 2 
        WHEN tof."TypeOfFruits" = 'G' THEN 3 
        ELSE 4 END) as NUM
    
            FROM ..... <rest of your query without group by and order by .....
        )
    
    GROUP BY Fruits
    ORDER BY NUM
    
  5. ==============================

    5.이 ... 검증되지 않은 뭔가를 시도해 볼 수도 있습니다,하지만 난 비슷한 쿼리를 보았다. 작동하는지 알려주세요 ...

    이 ... 검증되지 않은 뭔가를 시도해 볼 수도 있습니다,하지만 난 비슷한 쿼리를 보았다. 작동하는지 알려주세요 ...

    SELECT "Fruits",
        SUM(CASE WHEN r.order_date 
            BETWEEN DATE_TRUNC('DAY', LOCALTIMESTAMP) AND DATE_TRUNC('DAY', LOCALTIMESTAMP) + INTERVAL '1 DAY' 
            THEN 1 ELSE 0 END) AS daily, 
        SUM(CASE WHEN r.order_date 
            BETWEEN DATE_TRUNC('MONTH', LOCALTIMESTAMP) AND DATE_TRUNC('MONTH', LOCALTIMESTAMP) + INTERVAL '1 MONTH' 
            THEN 1 ELSE 0 END) AS monthly, 
        SUM(CASE WHEN r.order_date 
            BETWEEN DATE_TRUNC('YEAR', LOCALTIMESTAMP) AND DATE_TRUNC('YEAR', LOCALTIMESTAMP) + INTERVAL '1 YEAR' 
            THEN 1 ELSE 0 END) AS yearly, 
        SUM(CASE WHEN r.order_date >= '01-01-2011 00:00:00' THEN 1 ELSE 0 END) AS lifetime 
    FROM reports AS r
        ,(SELECT "ID",
                 CASE
                    WHEN tof."TypeOfFruits" = 'A' THEN 'Apple' 
                    WHEN tof."TypeOfFruits" = 'P' THEN 'Pear' 
                    WHEN tof."TypeOfFruits" = 'G' THEN 'Grapes' 
                    ELSE 'Other'
                 END AS "Fruits" FROM "TypeOfFruits" ) AS "tof"
    WHERE r.id = tof."ID" 
    GROUP BY "Fruits"
    ORDER BY CASE 
        WHEN "Fruits" = 'Apple' THEN 1 
        WHEN "Fruits" = 'Pear' THEN 2 
        WHEN "Fruits" = 'Grapes' THEN 3 
        ELSE 4 
    END
    
  6. ==============================

    6.당신의 별명을 래핑하는 대신 싱글 / 더블 따옴표의 역 따옴표를 (`)를 사용하여보십시오.

    당신의 별명을 래핑하는 대신 싱글 / 더블 따옴표의 역 따옴표를 (`)를 사용하여보십시오.

    MySQL의와 같은 문제가 있었다; 역 따옴표 문제를 해결했습니다.

  7. from https://stackoverflow.com/questions/6458669/order-by-alias-not-working by cc-by-sa and MIT license