【问题标题】:SQL converting two address column into oneSQL将两个地址列合二为一
【发布时间】:2021-03-22 18:24:30
【问题描述】:

我有一张桌子

结果我希望只有两列名称和地址,对于 add1 和 aad2,如果它们相似,我只想在地址中显示一次,对于不同的 aad1 和 add2,我想在两个不同的行中显示两次 我期待这个输出

【问题讨论】:

  • 请用您正在运行的数据库标记您的问题:mysql、oracle、sqlserver...?

标签: sql sql-server duplicates unpivot


【解决方案1】:

在oracle数据库和sql-server中,联合运算符删除重复行

select name, add1 as address from mytable
union
select name, add2 from mytable

【讨论】:

    【解决方案2】:

    我喜欢使用 cross apply 进行反透视。在您的情况下,您可以使用如下逻辑:

    select t.name, v.add
    from t cross apply
         (values (1, add1), (2, add2)) v(n, add)
    where n = 1 or (n = 2 and t.add1 <> t.add2);
    

    也就是说,总是取第一个地址。当第二个与第一个不同时,取第二个。

    【讨论】:

      【解决方案3】:

      一种可移植的方法使用union all 将列转为行并消除重复项:

      select name, add1 as add from mytable
      union all select name, add2 from mytable where add2 <> add1
      

      根据您的数据库,可能会有更好的选择。一个典型的解决方案是横向连接 - 但语法高度依赖于数据库(并非所有数据库都实现了该功能)。


      编辑:在 SQL Server 中:

      select t.name, a.add
      from mytable t
      cross apply (values (add1), (case when add1 <> add2 then add2 end)) a(add)
      where a.add is not null
      

      【讨论】:

      • 老兄这工作我不知道是怎么做到的,但是谢谢!!
      • 欢迎@shubham。由于您最终标记了您的问题 SQL Server,因此我为该数据库添加了一个(更好的)解决方案。
      • 抱歉,堆栈溢出时新的响应迟了
      猜你喜欢
      • 2016-11-28
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多