在别名字段SQL中选择第一个副本

时间:2015-07-23 15:32:43

标签: sql sql-server tsql

我有一个SQL查询,它使用CASE .. WHEN语句根据其他字段的值创建别名字段。

SELECT 
  ID,
  CASE 
    WHEN LEN(LastName) = 0 THEN FirstName
  END AS DisplayName
FROM MyTable

结果SELECT语句通常包含别名DisplayName的“重复”。我知道它们并不是真正的重复,因为ID字段是唯一的。如果我不关心与哪个ID相关联,如何获取DisplayName的DISTINCT列表?由于Logical Operator Precedence的顺序,我无法在DisplayName语句中使用GROUP BY别名。

更新 - 我应该提到我确实需要取回ID,只要该ID与其中一个重复项(第一个,最后一个等)相关联。

5 个答案:

答案 0 :(得分:1)

SELECT
   MAX(ID) [ID],
   DisplayName
FROM (
    SELECT 
      ID,
      CASE 
        WHEN LEN(LastName) = 0 THEN FirstName
      END AS DisplayName
    FROM MyTable
) a
GROUP BY DisplayName

答案 1 :(得分:1)

我假设逻辑是你想要姓氏(如果有的话),否则就是名字。这不完全是您的查询所做的。

只需使用case语句聚合:

SELECT MIN(ID) as id
       (CASE WHEN LEN(LastName) = 0 THEN FirstName ELSE LastName END) AS DisplayName
FROM MyTable
GROUP BY (CASE WHEN LEN(LastName) = 0 THEN FirstName ELSE LastName END);

如果您将空值存储为NULL而不是'',则可以更简单地将其写为:

SELECT MIN(ID) as id
       COALESCE(LastName, FirstName) AS DisplayName
FROM MyTable
GROUP BY COALESCE(LastName, FirstName) ;

答案 2 :(得分:0)

with x as (
SELECT 
 ID,
 CASE 
  WHEN LEN(LastName) = 0 THEN FirstName
  END AS DisplayName
  FROM MyTable)
select distinct id, displayname from x

如果您更喜欢使用cte,这是一种方法。

答案 3 :(得分:0)

如果您想GROUP BY别名,那么您需要使用嵌套查询。

SELECT MAX(t.ID), t.DisplayName FROM (
SELECT 
  ID,
  CASE WHEN LEN(LastName) = 0 THEN FirstName END AS 'DisplayName'
FROM MyTable) as t
GROUP BY t.DisplayName

由于您必须返回一个ID,并且您不关心返回哪个ID,只需返回MAX一个。只要您有一个聚合您的ID的功能,例如MAXMIN,您就可以按DisplayName进行分组。

答案 4 :(得分:0)

您可以使用Row_Number()OVER()并选择第一个实例。我不确定你是否打算在CASE WHEN中排除ELSE语句,但是如果姓氏的长度为0,它将返回第一个名称,否则返回NULL。

SELECT ID,DisplayName
FROM
(
  SELECT 
    Row_Number() OVER(PARTITION BY CASE 
      WHEN LEN(LastName) = 0 THEN FirstName
    END

    ORDER BY CASE 
      WHEN LEN(LastName) = 0 THEN FirstName
    END
    ) RowID,
    ID,
    CASE 
      WHEN LEN(LastName) = 0 THEN FirstName
    END AS DisplayName
  FROM MyTable
 ) a
 WHERE RowID = 1