SQL 구문이 궁금합니다. 내가 가지고 있다면
SELECT
itemName as ItemName,
substring(itemName, 1,1) as FirstLetter,
Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter
이것은 잘못된 것이므로
GROUP BY itemName, FirstLetter
정말로해야한다
GROUP BY itemName, substring(itemName, 1,1)
그러나 왜 편리 성을 위해 단순히 전자를 사용할 수 없습니까?
답변
SQL은 다음 순서로 쿼리가 실행 된 것처럼 구현됩니다.
- FROM 절
- WHERE 절
- GROUP BY 절
- HAVING 절
- SELECT 절
- ORDER BY 절
대부분의 관계형 데이터베이스 시스템에서이 순서는 이전 단계에서 도입되었으므로 유효한 이름 (열 또는 별명)을 설명합니다.
따라서 Oracle 및 SQL Server에서는 GROUP BY가 SELECT 절보다 먼저 실행되므로 SELECT 절에 정의한 GROUP BY 절에 용어를 사용할 수 없습니다.
그러나 예외는 있습니다 : MySQL과 Postgres는이를 가능하게하는 추가적인 지능을 가지고있는 것 같습니다.
답변
별명을 사용할 수 있도록 항상 부속 조회를 사용할 수 있습니다. 물론 성능을 점검하십시오 (db 서버가 동일하게 실행되지만 검증하기 위해 아프지 않음).
SELECT ItemName, FirstLetter, COUNT(ItemName)
FROM (
SELECT ItemName, SUBSTRING(ItemName, 1, 1) AS FirstLetter
FROM table1
) ItemNames
GROUP BY ItemName, FirstLetter
답변
적어도 PostgreSQL에서는 GROUP BY 절의 결과 집합에서 열 번호를 사용할 수 있습니다.
SELECT
itemName as ItemName,
substring(itemName, 1,1) as FirstLetter,
Count(itemName)
FROM table1
GROUP BY 1, 2
물론 이것을 대화식으로 수행하고 결과에서 열의 수 또는 순서를 변경하기 위해 쿼리를 편집하면 어려움이 시작됩니다. 그러나 여전히.
답변
SQL Server에서는 논리적 처리 순서로 인해 GROUP BY 절에서 별칭을 참조 할 수 없습니다. GROUP BY 절은 SELECT 절 전에 처리되므로 GROUP BY 절을 평가할 때 별명을 알 수 없습니다. 또한 ORDER BY 절에서 별명을 사용할 수있는 이유에 대해서도 설명합니다.
다음은 SQL Server 논리 처리 단계 에 대한 정보를 제공하는 소스 중 하나 입니다.
답변
왜 그런지 대답하지는 않지만 CROSS APPLY
별칭을 만드는 데 사용하여 SQL Server의 한계를 극복하고 싶었습니다 . 그런 다음 GROUP BY
절에서 다음과 같이 사용하십시오 .
SELECT
itemName as ItemName,
FirstLetter,
Count(itemName)
FROM table1
CROSS APPLY (SELECT substring(itemName, 1,1) as FirstLetter) Alias
GROUP BY itemName, FirstLetter
답변
Postgres와 같이 Group By에서 별칭을 지원하는 서비스 (예 : postgres)에서 별칭을 사용하면 의도하지 않은 결과가 발생할 수 있습니다. 예를 들어, 내부 명령문에 이미 존재하는 별명을 작성하면 Group By가 내부 필드 이름을 선택합니다.
-- Working example in postgres
select col1 as col1_1, avg(col3) as col2_1
from
(select gender as col1, maritalstatus as col2,
yearlyincome as col3 from customer) as layer_1
group by col1_1;
-- Failing example in postgres
select col2 as col1, avg(col3)
from
(select gender as col1, maritalstatus as col2,
yearlyincome as col3 from customer) as layer_1
group by col1;
답변
일부 DBMS에서는 전체 식을 반복하지 않고 별칭을 사용할 수 있습니다.
Teradata가 그러한 예 중 하나입니다.
이 SO 질문에 설명 된 이유로 Bill이 권장하는 서수 위치 표기법을 피 합니다.
쉽고 강력한 대안은 항상 GROUP BY 절에서 표현식을 반복하는 것입니다.
DRY는 SQL에 적용되지 않습니다.