[SQL] ORDER BY 별칭이 작동하지 않습니다
SQLORDER 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에 의해 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.그 이유는 문서에서 찾을 수 있습니다 :
그 이유는 문서에서 찾을 수 있습니다 :
(내 강조)
그 이유는 SQL 표준 (SQL-92)의 이전 버전만을 새로운 버전 임의의 식에 의해 분류 할 수있는 반면, 출력 컬럼 이름 또는 번호로 정렬 허용하지만, 이러한 표현은 입력 열 값으로 형성된다는 것이다.
다른 답변은 이미 귀하의 경우에 적합한 다양한 해결 방법을 포함하고있다.
-
==============================
3.별칭은 당신에 의해 순서대로 사용할 수 없도록 의한 주문 후 지정됩니다. 대신 사용 :
별칭은 당신에 의해 순서대로 사용할 수 없도록 의한 주문 후 지정됩니다. 대신 사용 :
(CASE WHEN tof."TypeOfFruits" = 'A' THEN 'Apple' WHEN tof."TypeOfFruits" = 'P' THEN 'Pear' WHEN tof."TypeOfFruits" = 'G' THEN 'Grapes' ELSE 'Other' END)
-
==============================
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.이 ... 검증되지 않은 뭔가를 시도해 볼 수도 있습니다,하지만 난 비슷한 쿼리를 보았다. 작동하는지 알려주세요 ...
이 ... 검증되지 않은 뭔가를 시도해 볼 수도 있습니다,하지만 난 비슷한 쿼리를 보았다. 작동하는지 알려주세요 ...
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.당신의 별명을 래핑하는 대신 싱글 / 더블 따옴표의 역 따옴표를 (`)를 사용하여보십시오.
당신의 별명을 래핑하는 대신 싱글 / 더블 따옴표의 역 따옴표를 (`)를 사용하여보십시오.
MySQL의와 같은 문제가 있었다; 역 따옴표 문제를 해결했습니다.
from https://stackoverflow.com/questions/6458669/order-by-alias-not-working by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] PostgreSQL은 부분 인덱스를 사용하지 않습니다 (0) | 2020.07.11 |
---|---|
[SQL] XAMPP에 연결 SQLSRV (0) | 2020.07.11 |
[SQL] 쿼리를 작성하는 문자열 연결을 피 (0) | 2020.07.11 |
[SQL] UNION, INTERSECT 및 EXCEPT에 대한 SQLEXCEPTION (0) | 2020.07.11 |
[SQL] SQL에서 한 번에 간격을 병합 (0) | 2020.07.11 |