programing

SQL Server의 에일리어스 컬럼에서 GROUP BY를 실행하려면 어떻게 해야 합니까?

jooyons 2023. 4. 10. 21:35
반응형

SQL Server의 에일리어스 컬럼에서 GROUP BY를 실행하려면 어떻게 해야 합니까?

앨리어스된 열(아래 예)에서 작업을 통해 그룹을 수행하려고 하지만 올바른 구문을 확인할 수 없습니다.

SELECT       LastName + ', ' + FirstName AS 'FullName'
FROM         customers
GROUP BY     'FullName'

올바른 구문은 무엇입니까?

질문을 더 확장해도(예상치 못한 답변) CASEED 별칭 열에 솔루션이 적용됩니까?

SELECT       
    CASE
        WHEN LastName IS NULL THEN FirstName
        WHEN LastName IS NOT NULL THEN LastName + ', ' + FirstName
    END AS 'FullName'
FROM         customers
GROUP BY     
    LastName, FirstName

그리고 대답은 여전히 적용된다는 것입니다.

에일리어스가 아닌 그룹화할 식을 전달합니다.

SELECT       LastName + ', ' + FirstName AS 'FullName'
FROM         customers
GROUP BY      LastName + ', ' + FirstName

이게 내가 하는 일이야.

SELECT FullName
FROM
(
  SELECT LastName + ', ' + FirstName AS FullName
  FROM customers
) as sub
GROUP BY FullName

이 기법은, 「편집」시나리오에 간단하게 적용됩니다.

SELECT FullName
FROM
(
  SELECT
     CASE
       WHEN LastName IS NULL THEN FirstName
       WHEN LastName IS NOT NULL THEN LastName + ', ' + FirstName
     END AS FullName
  FROM customers
) as sub
GROUP BY FullName

유감스럽게도 GROUP BY 스테이트먼트에서 가명을 참조할 수 없습니다.놀라운 것처럼 보이는 논리를 다시 써야 합니다.

SELECT       LastName + ', ' + FirstName AS 'FullName'
FROM         customers
GROUP BY     LastName + ', ' + FirstName

또는 선택 항목을 하위 선택 식 또는 일반 테이블 식에 넣을 수 있습니다. 그 후 열 이름을 그룹화할 수 있습니다(에일리어스는 더 이상 사용할 수 없습니다).

죄송합니다. MS SQL Server에서는 불가능합니다(Postgre에서는 가능).SQL):

select lastname + ', ' + firstname as fullname
from person
group by fullname

그렇지 않으면 다음을 사용합니다.

select x.fullname
from 
(
    select lastname + ', ' + firstname as fullname
    from person
) as x
group by x.fullname

또는 다음과 같습니다.

select lastname + ', ' + firstname as fullname
from person
group by lastname, firstname  -- no need to put the ', '

위의 쿼리가 더 빠릅니다. 먼저 필드를 그룹화한 다음 해당 필드를 계산합니다.

다음 쿼리는 속도가 느립니다(먼저 선택한 식을 계산한 다음 해당 계산에 따라 레코드를 그룹화합니다).

select lastname + ', ' + firstname as fullname
from person
group by lastname + ', ' + firstname

당신이 편집한 문제 설명에 따르면COALESCE() 어려운 CASE§:

SELECT FullName
FROM (
  SELECT COALESCE(LastName+', '+FirstName, FirstName) AS FullName
  FROM customers
) c
GROUP BY FullName;

내 추측은:

SELECT       LastName + ', ' + FirstName AS 'FullName'
FROM         customers
GROUP BY     LastName + ', ' + FirstName

Oracle에도 비슷한 제한이 있어 짜증납니다.더 좋은 해결책이 있는지 궁금합니다.

질문의 후반부에 답하기 위해, 이 제한은 케이스 스테이트먼트와 같은 보다 복잡한 표현에도 적용됩니다.서브셀렉트를 사용하여 복잡한 식에 이름을 붙이는 것이 지금까지 본 제안 중 가장 좋습니다.

하시면 됩니다.CROSS APPLY하여 에일리어스를 합니다.GROUP BY절을 붙입니다

SELECT       FullName
FROM         Customers
CROSS APPLY  (SELECT LastName + ', ' + FirstName AS FullName) Alias
GROUP BY     FullName
SELECT       
    CASE
        WHEN LastName IS NULL THEN FirstName
        WHEN LastName IS NOT NULL THEN LastName + ', ' + FirstName
    END AS 'FullName'
FROM
    customers
GROUP BY     
    LastName,
    FirstName

사용하는 수식(CASE 문)에서는, 2개의 다른 입력에 대해서 같은 답을 얻을 수 없기 때문에, 이것은 유효합니다.

이것은 다음과 같은 것을 사용한 경우에는 해당되지 않습니다.

LEFT(FirstName, 1) + ' ' + LastName

이러한 경우 "제임스 테일러"와 "존 테일러"는 둘 다 "J 테일러"가 된다.

출력에 "J Taylor"를 두 번 사용하는 경우(각 개인당 1개씩)

GROUP BY LastName, FirstName

그러나 "J Taylor" 한 줄만 원하는 경우:

GROUP BY LastName, LEFT(FirstName, 1)

문의에 케이스 스테이트먼트가 두 번 혼재하는 것을 방지하려면 사용자 정의 함수에 넣을 수 있습니다.

죄송합니다. SQL Server는 그룹화 기준 절 앞에 데이터 집합을 렌더링하지 않으므로 열 별칭을 사용할 수 없습니다.Order By에서 사용할 수 있습니다.

이전 FoxPro(버전 2.5 이후 사용하지 않음)에서는 다음과 같이 쓸 수 있습니다.

SELECT       LastName + ', ' + FirstName AS 'FullName', Birthday, Title
FROM         customers
GROUP BY     1,3,2

나는 그 구문이 정말 마음에 들었다.왜 다른 곳에서는 구현되지 않는 거죠?좋은 지름길이지만, 다른 문제가 생길 것 같은데요?

SELECT 
CASE WHEN LastName IS NULL THEN FirstName         
     WHEN LastName IS NOT NULL THEN LastName + ', ' + FirstName     
END AS 'FullName' 
FROM  customers GROUP BY 1`

다음과 같은 문제가 있는 경우(0과 늘의 값이 동등하게 취급되도록 그룹화)

SELECT AccountNumber, Amount AS MyAlias
FROM Transactions
GROUP BY AccountNumber, ISNULL(Amount, 0)

(예를 들어 SQL Server에서 그룹화 기준 또는 집계 함수에 "금액" 필드가 포함되어 있지 않다고 불평함)

...SELECT에 동일한 기능을 배치하는 것을 잊지 마십시오...

SELECT AccountNumber, ISNULL(Amount, 0) AS MyAlias
FROM Transactions
GROUP BY AccountNumber, ISNULL(Amount, 0)

언급URL : https://stackoverflow.com/questions/497241/how-do-i-perform-a-group-by-on-an-aliased-column-in-sql-server

반응형