How do I perform a GROUP BY on an aliased column in MS-SQL Server?

后端 未结 12 1663
慢半拍i
慢半拍i 2020-11-29 00:20

I\'m trying to perform a group by action on an aliased column (example below) but can\'t determine the proper syntax.

SELECT       LastName + \', \'         


        
相关标签:
12条回答
  • 2020-11-29 01:00

    For anyone who finds themselves with the following problem (grouping by ensuring zero and null values are treated as equals)...

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

    (I.e. SQL Server complains that you haven't included the field Amount in your Group By or aggregate function)

    ...remember to place the exact same function in your SELECT...

    SELECT AccountNumber, ISNULL(Amount, 0) AS MyAlias
    FROM Transactions
    GROUP BY AccountNumber, ISNULL(Amount, 0)
    
    0 讨论(0)
  • 2020-11-29 01:02
    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
    

    This works because the formula you use (the CASE statement) can never give the same answer for two different inputs.

    This is not the case if you used something like:

    LEFT(FirstName, 1) + ' ' + LastName
    

    In such a case "James Taylor" and "John Taylor" would both result in "J Taylor".

    If you wanted your output to have "J Taylor" twice (one for each person):

    GROUP BY LastName, FirstName
    

    If, however, you wanted just one row of "J Taylor" you'd want:

    GROUP BY LastName, LEFT(FirstName, 1)
    
    0 讨论(0)
  • 2020-11-29 01:05

    My guess is:

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

    Oracle has a similar limitation, which is annoying. I'm curious if there exists a better solution.

    To answer the second half of the question, this limitation applies to more complex expressions such as your case statement as well. The best suggestion I've seen it to use a sub-select to name the complex expression.

    0 讨论(0)
  • 2020-11-29 01:05

    In the old FoxPro (I haven't used it since version 2.5), you could write something like this:

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

    I really liked that syntax. Why isn't it implemented anywhere else? It's a nice shortcut, but I assume it causes other problems?

    0 讨论(0)
  • 2020-11-29 01:05
    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 讨论(0)
  • 2020-11-29 01:07

    Sorry, this is not possible with MS SQL Server (possible though with PostgreSQL):

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

    Otherwise just use this:

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

    Or this:

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

    The above query is faster, groups the fields first, then compute those fields.

    The following query is slower (it tries to compute first the select expression, then it groups the records based on that computation).

    select lastname + ', ' + firstname as fullname
    from person
    group by lastname + ', ' + firstname
    
    0 讨论(0)
提交回复
热议问题