如何将多列组合成一列,将其数据组合到另一列?

时间:2015-06-04 03:20:59

标签: sql sql-server

我在发布之前首先环顾四周,发现了很多像这样的问题但不是我想要的解决方案,这个问题不同......

我的任务是规范现有数据库,现在我在编写一个对现有数据库透明的视图时遇到困难,所以我写了这个......

SELECT 
    Customer.CustomerID, CustomerContact.CustomerContactID,
    CustomerPhone.Phone AS "1",
    CustomerPhone.Work AS "2",
    CustomerPhone.Mobile AS "3",
    CustomerPhone.Fax AS "4",
    CustomerPhone.Other AS "5", 
    CustomerSpouse.Spouse AS "6", 
    CustomerSpouse.SpouseMobile AS "7"
FROM
    [Customer] 
INNER JOIN 
    CustomerContact ON Customer.CustomerID = CustomerContact.CustomerID 
INNER JOIN 
    CustomerPhone ON CustomerContact.CustomerContactID = CustomerPhone.CustomerContactID 
INNER JOIN 
    CustomerSpouse ON CustomerContact.CustomerContactID = CustomerSpouse.CustomerContactID

所以我在规范化方面犯了一个错误,在现有数据库中,CustomerPhone表看起来像这样

Existing database table

现在我不知道如何将所有列放入名为PhoneType的新列中,并在名为PhoneNumber的另一列中显示电话号码。

我宁愿不必回去改变我已经做过的表格,这是最后的手段。

我道歉,如果我解释它听起来有点令人困惑,如果确实如此,请告诉我,我会做一个编辑,并尝试更好地解释它。

由于

修改 这是表格的图表

Diagram

以下是我使用我编写的查询返回的内容

What is being returned with my query

因此,我需要将每个具有标题整数的列放在名为PhoneType的列中,并将其对应的电话号码放入名为PhoneNumber的列中。

我的查询需要做的就是让它返回。

PhoneType | PhoneNumber
1         | 123-4567
2         | 234-5678
3         | 345-6789

1 个答案:

答案 0 :(得分:1)

我想你想要unpivot(另见this question)

create table phones_wide (customerid int, "1" varchar(20), "2" varchar(20), "3" varchar(20), "4" varchar(20), "5" varchar(20), "6" varchar(20), "7" varchar(20));
insert into phones_wide values (1234, '123-4342', '223-4342', '323-4342', '423-4342', '523-4342', '623-4342', '723-4342')

select PhoneType, PhoneNumber
from phones_wide
unpivot
(
  PhoneNumber
  for PhoneType in ("1","2","3","4","5","6","7")
) u;

drop table phones_wide

输出:

PhoneType   PhoneNumber
1   123-4342
2   223-4342
3   323-4342
4   423-4342
5   523-4342
6   623-4342
7   723-4342