基于其他列在Sql Server中创建新列

时间:2017-10-27 09:29:39

标签: sql sql-server

我有一张桌子T:

CREATE TABLE T 
(
id INT,
type VARCHAR(200),
type_value VARCHAR(10),
value  VARCHAR(200)
);


INSERT INTO T VALUES (1,    'HomePhone',   'p1',    '1234 ');
INSERT INTO T VALUES (1,    'HomePhone',    'p2',    '5678 ');
INSERT INTO T VALUES (1,    'HomePhone',    'p3',    '4567');
INSERT INTO T VALUES (1,    'WorkPhone',    'w1',    '9007 ');
INSERT INTO T VALUES (2,    'Email',             'e1',    'abc@xyz.com ');
INSERT INTO T VALUES (2,    'Email',             'e1',    'efg@xyz.com');
INSERT INTO T VALUES (2,    'Email',             'e2',    'mno@xyz.com');
INSERT INTO T VALUES (3,    'WorkPhone',    'w1',    '0100');
INSERT INTO T VALUES (3,    'WorkPhone',    'w2',    '0110');
INSERT INTO T VALUES (4,    'OtherPhone',    'o1',    '1010 ');
INSERT INTO T VALUES (4,    'OtherPhone',    'o1',    '1110 ');
INSERT INTO T VALUES (4,    'OtherPhone',    'o1',    '1011');
INSERT INTO T VALUES (4,    'HomePhone',    'p1',    '2567 ');

我需要将其转换为:

id   primaryhomephone    secondaryhomephone    primaryemail   secondaryemail   Primaryworkphone    secondaryworkphone    primaryotherphone   secondaryotherphone 
----------------------------------------------------------------------------------------------------------------------------------------------------------------
1    1234                5678                  null           null             9007                 null                 null                null
2    null                null                  abc@xyz.com    efg@xyz.com      null                 null                 null                null
3    null                null                  null           null             0100                 0110                 null                null
4    2567                null                  null           null             null                 null                 1010                1011 

基本上,该字段将根据type_value进行划分。如果相同的id和type有两个type_value,则第一个类型将是primary,第二个类型将是secondary 对于相同id和类型的两个以上类型值,丢弃第三个类型值 对于id为4的相同类型的两个以上类型值(例如o1,o1),第一个o1将是primaryotherphone,第二个将是secondaryprimaryphone。

对不起,如果这个问题之前已经重复过,但不知怎的,我无法解决。谁能请帮忙。
非常感谢

3 个答案:

答案 0 :(得分:1)

您可以使用MAX / GROUP BY技术。对于初学者来说,PIVOT非常复杂,但我同意PIVOT的目的正是你所需要的:

SELECT id
, MAX(CASE WHEN type_value = 'p1' THEN value END ) AS primaryhomephone
, MAX(CASE WHEN type_value = 'p2' THEN value END ) AS secondaryhomephone
, MAX(CASE WHEN type_value = 'p3' THEN value END ) AS thirdphone
, MAX(CASE WHEN type_value = 'w1' THEN value END ) AS workphone
, MAX(CASE WHEN type_value = 'w2' THEN value END ) AS secondaryworkphone
, MAX(CASE WHEN type_value = 'o2' THEN value END ) AS otherworkphone
, MAX(CASE WHEN type_value = 'e1' THEN value END ) AS primaryemail
, MAX(CASE WHEN type_value = 'e2' THEN value END ) AS secondaryemail
FROM T
GROUP BY id
;

答案 1 :(得分:0)

您需要在SQL Server中照顾computed columns

CREATE TABLE [dbo].T
(
   ...
   [primaryhomephone] AS (CASE WHEN type_value = 'p1' THEN value ELSE NULL END)
)

或者您可以使用Views:

CREATE VIEW dbo.vwT
AS
SELECT 
   id
   ,(CASE WHEN type_value = 'p1' THEN value ELSE NULL END as [primaryhomephone]
   , (CASE WHEN type_value = 'p2' THEN value ELSE NULL END as [secondaryhomephone]
FROM dbo.T

答案 2 :(得分:0)

您需要查看PIVOT列演示文稿。您可以使用它,您可以使用列创建新表,然后使用PIVOT Query将它们插入到那里,或者您可以在运行时简单地获取。如果有大量数据且所有其他编程接口都准备升级,那么请创建新表,否则只需使用查询。

以下链接供您参考:https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx