如何为源数据中的每个唯一值创建单独的行

时间:2015-06-08 23:17:55

标签: sql sql-server sql-server-2008 tsql

我有以下表格:

Cus_ID  Work_Phone     Home_Phone     Mobile_Phone
1       x              Blank          x
2       x              x              Blank
3       x              x              x
.
.
. and so on (1000s of rows)

Work_Phone,Home_Phone,Mobile_Phone - varchar

x =存在某个值

我需要从源数据中选择将其移动到目标系统,如下所示,我需要为每个Cus_ID为唯一值创建单独的行。我该怎么做?

Cus_ID    Type      ContactNo
1         Work       x
1         Mobile     x
2         Work       x
2         Home       x
3         Work       x
3         Home       x
3         Mobile     x

.. and so on

类型,ContactNo - varchar

x =应该是Source表中的对应值

2 个答案:

答案 0 :(得分:1)

以上结果我们可以通过基于您的假设数据

来实现UNPIVOT或Cross Apply
declare @t table (PK varchar(1),col1 varchar(1),col2 varchar(1),col3 varchar(1))
      insert into @t(PK,col1,col2,col3)values 
        ('X','a','','c'),
        ('y','a','b',''),
        ('z','a','b','c')

交叉申请:

select PK,value
from @t
cross apply
(
    values
        ('I1', col1),
        ('I2', col2),
        ('I3', col3)
) c(col, value)
where value is not null AND value <> ''
order by PK, col

<强> UNPIVOT

select PK,value
from @t
unpivot
(
  value
  for col in (col1, col2, col3)
) un
WHERE value <> ''
order by PK, col;

答案 1 :(得分:0)

假设col1col2col3属于同一类型,则:

SELECT pk, col2 AS target_value FROM your_table WHERE col2 IS NOT NULL
UNION 
SELECT pk, col3 AS target_value FROM your_table WHERE col3 IS NOT NULL
UNION 
SELECT pk, col4 AS target_value FROM your_table WHERE col4 IS NOT NULL
ORDER BY pk

修改编辑:这是包含ISNULL测试,列标题和其他内容的版本,以回应您修改过的问题:

SELECT Cus_ID, 'Work' AS Type, Work_Phone AS ContactNo FROM your_table
   WHERE ISNULL(Work_Phone, '') <> ''
UNION 
SELECT Cus_ID, 'Home' AS Type, Home_Phone AS ContactNo FROM your_table
   WHERE ISNULL(Home_Phone, '') <> ''
UNION
SELECT Cus_ID, 'Mobile' AS Type, Mobile_Phone AS ContactNo FROM your_table
   WHERE ISNULL(Mobile_Phone, '') <> ''
ORDER BY 1

如果“空白”列可能包含空格字符,则进一步优化它:

... ISNULL(LTRIM(Work_Phone), '') <> ''