代码之家  ›  专栏  ›  技术社区  ›  Gavin Miller

如何在MS-SQL Server中对别名列执行分组依据?

  •  51
  • Gavin Miller  · 技术社区  · 16 年前

    我在试着表演一个舞蹈 分组

    SELECT       LastName + ', ' + FirstName AS 'FullName'
    FROM         customers
    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
    

    答案是肯定的,它仍然适用。

    12 回复  |  直到 16 年前
        1
  •  87
  •   cmsjr    16 年前

    传递要分组的表达式,而不是别名

    SELECT       LastName + ', ' + FirstName AS 'FullName'
    FROM         customers
    GROUP BY      LastName + ', ' + FirstName
    
        2
  •  50
  •   Amy B    16 年前

    我就是这么做的。

    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
  •  9
  •   James Orr    16 年前

    不幸的是,您不能在GROUPBY语句中引用您的别名,您必须再次编写逻辑,这看起来很神奇。

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

    或者,您可以将select放入子select或公共表表达式中,然后可以按列名分组(不再是别名)

        4
  •  7
  •   Peter Mortensen icecrime    14 年前

    很抱歉,这在MS SQL Server中是不可能的(尽管在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
  •  3
  •   Bill Karwin    16 年前

    根据您编辑的问题描述,我建议使用 COALESCE() 而不是那笨重的 CASE 表达方式:

    SELECT FullName
    FROM (
      SELECT COALESCE(LastName+', '+FirstName, FirstName) AS FullName
      FROM customers
    ) c
    GROUP BY FullName;
    
        6
  •  3
  •   Jon Ericson Homunculus Reticulli    16 年前

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

    甲骨文也有类似的限制,这很烦人。我很好奇是否有更好的解决办法。

    为了回答问题的后半部分,这个限制也适用于更复杂的表达式,例如您的案例陈述。我看到的最好的建议是使用一个子选择来命名复杂表达式。

        7
  •  3
  •   Ricardo C. zero    8 年前

    你可以用 CROSS APPLY 创建别名并在中使用它的步骤 GROUP BY 例如:

    SELECT       FullName
    FROM         Customers
    CROSS APPLY  (SELECT LastName + ', ' + FirstName AS FullName) Alias
    GROUP BY     FullName
    
        8
  •  1
  •   MatBailie    16 年前
    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语句)无法为两个不同的输入提供相同的答案。

    LEFT(FirstName, 1) + ' ' + LastName
    

    在这种情况下,“詹姆斯·泰勒”和“约翰·泰勒”都会导致“J·泰勒”。

    如果您希望输出两次“J Taylor”(每人一次):

    GROUP BY LastName, FirstName
    

    但是,如果您只想要一行“J Taylor”,您会想要:

    GROUP BY LastName, LEFT(FirstName, 1)
    
        9
  •  0
  •   JeffO    16 年前

    如果希望避免case语句在查询中出现两次混乱,可以将其放在用户定义的函数中。

    很抱歉,SQL Server不会在Group By子句之前呈现数据集,因此列别名不可用。你可以按顺序用它。

        10
  •  0
  •   Peter Mortensen icecrime    14 年前

    旧时 FoxPro (从2.5版开始我就没用过),你可以这样写:

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

    我真的很喜欢这种语法。为什么它不在其他地方实施?这是一条很好的捷径,但我认为它会导致其他问题?

        11
  •  0
  •   Deepak Pathak    12 年前
    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
  •  0
  •   41st    10 年前

    对于发现自己有以下问题的任何人(通过确保零和空值被视为相等来分组)。。。

    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)