抱歉,我知道这是一个垃圾标题,但我想不出更简洁的方式来描述这个问题。
我有一个(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,如果它可以帮助任何人玩这个场景。
答案 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;
答案 1 :(得分:-1)
也许使用光标来收集所有客户ID并对字段进行排序...传统的排序技术就像我们以前在学校里做的那样... ++ ..想知道是否有其他可能的方法。
如果你没有得到任何,那么这是最后一种方式。确保执行需要很长时间。