我有以下表格:
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表中的对应值
答案 0 :(得分:1)
以上结果我们可以通过基于您的假设数据
来实现UNPIVOT或Cross Applydeclare @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)
假设col1
,col2
和col3
属于同一类型,则:
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), '') <> ''
等