복붙노트

[SQL] 어떻게 MS-SQL 서버의 별칭 열에 의해 그룹을 수행합니까?

SQL

어떻게 MS-SQL 서버의 별칭 열에 의해 그룹을 수행합니까?

I (예 : 아래) 앨리어스 열 작용에 의해 그룹을 수행하기 위해 노력하고있어하지만 올바른 구문을 확인할 수 없습니다.

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

그리고 그 대답은 여전히 ​​적용 되는가입니다.

해결법

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

    1.당신은 별명보다는 의해 그룹에 원하는 표현을 통과

    당신은 별명보다는 의해 그룹에 원하는 표현을 통과

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

    2.이것이 제가하는 것입니다.

    이것이 제가하는 것입니다.

    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
    
  3. ==============================

    3.불행하게도 당신이 문에 의해 그룹에 별칭을 참조 할 수 없습니다, 당신은이 보인다 놀라운, 다시 로직을 작성해야합니다.

    불행하게도 당신이 문에 의해 그룹에 별칭을 참조 할 수 없습니다, 당신은이 보인다 놀라운, 다시 로직을 작성해야합니다.

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

    다른 방법으로는, 부속 선택 또는 공통 테이블 식으로 선택을 넣을 수있는 한 후 수 열 이름에 그룹 (더 이상 별칭.)

  4. ==============================

    4.죄송합니다, 현재는 MS SQL 서버 (PostgreSQL을에 가능하지만)와 수 없습니다 :

    죄송합니다, 현재는 MS SQL 서버 (PostgreSQL을에 가능하지만)와 수 없습니다 :

    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
    
  5. ==============================

    5.귀하의 편집 문제 설명을 감안할 때, 내가 유착을 사용하는 것이 좋습니다 것 () 대신에 다루기 힘든 CASE 식의 :

    귀하의 편집 문제 설명을 감안할 때, 내가 유착을 사용하는 것이 좋습니다 것 () 대신에 다루기 힘든 CASE 식의 :

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

    6.내 생각 엔입니다 :

    내 생각 엔입니다 :

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

    오라클은 성가신 유사한 제한을 가지고 있습니다. 더 나은 솔루션이 존재하는지 궁금 해요.

    질문의 두 번째 절반에 대답하기 위해, 이러한 제한은 귀하의 경우 문뿐만 아니라 더 복잡한 식에 적용됩니다. 나는 그것이 사용하는 본 최고의 제안 복잡한 식의 이름을 서브-선택합니다.

  7. ==============================

    7.당신은 너무 같은 별칭을 만들고 GROUP BY 절에서 사용하는 CROSS을 적용 할 수 있습니다 :

    당신은 너무 같은 별칭을 만들고 GROUP BY 절에서 사용하는 CROSS을 적용 할 수 있습니다 :

    SELECT       FullName
    FROM         Customers
    CROSS APPLY  (SELECT LastName + ', ' + FirstName AS FullName) Alias
    GROUP BY     FullName
    
  8. ==============================

    8.

    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
    

    사용하는 식 (경우 문) 두 개의 서로 다른 입력에 대해 같은 대답을주지 않을 수 있기 때문 작동합니다.

    이것은 당신이 같은 것을 사용하는 경우이 아니다 :

    LEFT(FirstName, 1) + ' ' + LastName
    

    이러한 경우 "제임스 테일러 '와'존 테일러" "J 테일러"모두 결과는 것.

    당신은 두 번 "J 테일러"(사람마다 하나)가 당신의 출력을 원하는 경우 :

    GROUP BY LastName, FirstName
    

    그러나, 당신은 "J 테일러 '의 한 행을 원한다면 당신이 원하는 것 :

    GROUP BY LastName, LEFT(FirstName, 1)
    
  9. ==============================

    9.두 번 쿼리에있는 경우 문의 혼란을 피하려면 사용자 정의 - 기능에 배치 할 수 있습니다.

    두 번 쿼리에있는 경우 문의 혼란을 피하려면 사용자 정의 - 기능에 배치 할 수 있습니다.

    열 별칭을 사용할 수없는, 그래서 미안하지만, SQL Server는 Group By 절하기 전에 데이터 집합을 렌더링하지 않을 것입니다. 당신은 주문에 사용할 수 있습니다.

  10. ==============================

    10.당신이 뭔가를 쓸 수 이전 FoxPro에에서 (버전 2.5 이후 나는 그것을 사용하지 않은) :

    당신이 뭔가를 쓸 수 이전 FoxPro에에서 (버전 2.5 이후 나는 그것을 사용하지 않은) :

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

    난 정말 그 구문을 좋아했다. 왜 다른 곳에서는 실행되지 않는 이유는 무엇입니까? 그것은 좋은 바로 가기, 그러나 나는 다른 문제가 발생 같은데요?

  11. ==============================

    11.

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

    12.다음과 같은 문제로 자신을 발견 누군가를 위해 (제로를 보장하고 널 (null) 값이 동등하게 취급하여 그룹화) ...

    다음과 같은 문제로 자신을 발견 누군가를 위해 (제로를 보장하고 널 (null) 값이 동등하게 취급하여 그룹화) ...

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

    (즉, SQL Server는 당신의 그룹 또는 집계 함수에 필드 금액을 포함하지 않았 음을 불평)

    ... 당신의 선택에 동일한 기능을 배치 기억 ...

    SELECT AccountNumber, ISNULL(Amount, 0) AS MyAlias
    FROM Transactions
    GROUP BY AccountNumber, ISNULL(Amount, 0)
    
  13. from https://stackoverflow.com/questions/497241/how-do-i-perform-a-group-by-on-an-aliased-column-in-ms-sql-server by cc-by-sa and MIT license