我有一张桌子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。
对不起,如果这个问题之前已经重复过,但不知怎的,我无法解决。谁能请帮忙。
非常感谢
答案 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