【问题标题】:SQL Grouping with null rows具有空行的 SQL 分组
【发布时间】:2012-11-09 17:35:44
【问题描述】:

我搜索了一下,找不到任何可以解决我的确切问题的东西

我有一个表 (MSSQL),数据如下所示:

Source table:

RID    FullName FirstName   LastName    Email               Address
-------------------------------------------------------------------------------
1      NULL     [BOB]       NULL        NULL                NULL
1      NULL     NULL        [BOB]       NULL                NULL
1      NULL     NULL        NULL        [bob@bob.com]       NULL
2      NULL     [JAY]       NULL        NULL                NULL
2      NULL     NULL        [JAY]       NULL                NULL
2      NULL     NULL        NULL        [jerry@jerry.com]   NULL
3      NULL     [RICK]      NULL        NULL                NULL
3      NULL     NULL        [RICK]      NULL                NULL
3      NULL     NULL        NULL        [rick@rick.com]     NULL

但我需要将数据转换为如下所示:

Results table:

RID     FullName             Email                Address
---------------------------------------------------------
1       [BOB] [BOB]        [bob@bob.com]          NULL
2       [JAY] [JAY]        [jerry@jerry.com]      NULL
3       [RICK] [RICK]      [rick@rick.com]        NULL

注意:如果源表中的 Fullname 为 NULL,那么我们结合 FirstName 和 LastName。 (如果 FirstName 和 LastName 都为 NULL,那么我们只会得到一个 NULL FullName 结果,这完全没问题。

提前感谢您对此提供的任何帮助!

【问题讨论】:

    标签: sql sql-server tsql group-by


    【解决方案1】:

    你需要一个group by:

    select rid, coalesce(max(FullName), max(FirstName)+' '+max(LastName)) as FullName,
           max(Email) as Email,
           max(Address) as Address
    from t
    group by rid
    order by 1
    

    【讨论】:

    • 我已经尝试过了,但是缺少名称/电子邮件/地址上的聚合函数。你能告诉我为什么需要它们吗?这正确回答了我的问题(一旦允许我将标记为答案)。谢谢!
    • 只是好奇-为什么order by 1
    • 没关系,我相信我现在了解对 MAX() 聚合的需求。再次感谢。
    • order by 1order by rid 相同。您可以指定要排序的列的序号位置,在字段上使用聚合时特别有用!
    • 顺便说一句,您的答案并非 100% 正确。您应该在 MAX(FIRSTNAME) 和 MAX(LASTNAME) 上添加 ISNULL,否则在有人在表中没有 FIRSTNAME 或 LASTNAME 的情况下连接 NULL + ' ' + 'BOB' 将导致 NULL。
    【解决方案2】:

    这是一种方法,虽然有点复杂。我不知道您的完整数据集,但这应该为您提供所有可能的组合,以防每个 RID 有多个条目(例如,具有不同 FirstName 值的多行)。

    SELECT a.RID, b.FirstName + ' ' + c.LastName AS FullName, d.Email
    FROM myTable a
    LEFT OUTER JOIN myTable b ON a.RID = b.RID AND b.FirstName IS NOT NULL
    LEFT OUTER JOIN myTable c ON a.RID = c.RID AND c.LastName IS NOT NULL
    LEFT OUTER JOIN myTable d ON a.RID = d.RID AND d.Email IS NOT NULL
    GROUP BY a.RID, b.FirstName, c.LastName, d.Email
    

    SQL Fiddle example

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 2014-01-22
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 2019-05-10
      • 1970-01-01
      相关资源
      最近更新 更多