根据列数据重新排列和重复删除SQL列

时间:2013-04-03 10:10:41

标签: sql-server sql-server-2008

抱歉,我知道这是一个垃圾标题,但我想不出更简洁的方式来描述这个问题。

我有一个(MSSQL 2008)表,其中包含电话号码:

 | CustomerID | Tel1     | Tel2      | Tel3     | Tel4     | Tel5      | Tel6   |
 | Cust001    | 01222222 | 012333333 | 07111111 | 07222222 | 01222222  | NULL   |
 | Cust002    | 07444444 | 015333333 | 07555555 | 07555555 | NULL      | NULL   |
 | Cust003    | 01333333 | 017777777 | 07888888 | 07011111 | 016666666 | 013333 |

我想:

  • 删除所有重复的电话号码

  • 重新排列电话号码,以便以“07”开头的任何内容都是第一个电话号码。如果有多个07,则它们应位于第一个字段中。除此之外的数字顺序并不重要。

因此,例如,在处理之后,该表将如下所示:

 | CustomerID | Tel1     | Tel2      | Tel3      | Tel4      | Tel5     | Tel6      |
 | Cust001    | 07111111 | 07222222  | 01222222  | 012333333 | NULL     | NULL      |
 | Cust002    | 07444444 | 07555555  | 015333333 | NULL      | NULL     | NULL      |
 | Cust003    | 07888888 | 07011111  | 016666666 | 013333    | 01333333 | 017777777 |

我正在努力弄清楚如何有效地实现我的目标(表中有600,000多条记录)。有人可以帮忙吗?

我创建了一个fiddle,如果它可以帮助任何人玩这个场景。

2 个答案:

答案 0 :(得分:3)

您可以使用UNPIVOT将数字拆分为单独的行,然后使用ROW_NUMBER()根据“07”前缀的出现重新排序,最后使用PIVOT重新排序,最后得到6 Tel列再次。

select *
  FROM
  (
    select CustomerID, Col, Tel
      FROM
      (
        select *, Col='Tel' + RIGHT(
               row_number() over (partition by CustomerID
                                  order by case
                                         when Tel like '07%' then 1
                                         else 2
                                         end),10)
         from phonenumbers
         UNPIVOT (Tel for Seq in (Tel1,Tel2,Tel3,Tel4,Tel5,Tel6)) seqs
      ) U
  ) P
  PIVOT (MAX(TEL) for Col IN (Tel1,Tel2,Tel3,Tel4,Tel5,Tel6)) V;

SQL Fiddle

答案 1 :(得分:-1)

也许使用光标来收集所有客户ID并对字段进行排序...传统的排序技术就像我们以前在学校里做的那样... ++ ..想知道是否有其他可能的方法。

如果你没有得到任何,那么这是最后一种方式。确保执行需要很长时间。