2

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

我有一个包含电话号码的(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 多条记录)。任何人都可以帮忙吗?

如果它可以帮助任何人玩这个场景,我已经创建了一个小提琴。

4

2 回答 2

3

您可以使用 UNPIVOT 将数字分解为单独的行,然后使用 ROW_NUMBER() 根据出现的“07”前缀对它们重新排序,最后使用 PIVOT 重新组合它以Tel再次以 6 列结束。

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小提琴

于 2013-04-03T10:46:14.640 回答
-1

也许使用光标来收集所有客户 id 并对字段进行排序...传统的排序技术,就像我们在学校 c++ 中所做的那样 ..lolz ...想知道是否有任何其他方法。

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

于 2013-04-03T10:42:02.223 回答