【发布时间】:2013-06-09 04:34:22
【问题描述】:
今天我的同事要求我将数据从垂直暂存表转换为水平表。我的意思是将行转换为列。我使用 PIVOT 并解决了它。但是如果数据字段重复出现,我会遇到移动数据的麻烦。
这是我正在处理的测试数据:
CREATE TABLE STAGING
(
ENTITYID INT,
PROPERTYNAME VARCHAR(25),
PROPERTYVALUE VARCHAR(25)
)
INSERT INTO STAGING VALUES (1, 'NAME', 'DONNA')
INSERT INTO STAGING VALUES (1, 'SPOUSE', 'HENRY')
INSERT INTO STAGING VALUES (1, 'CHILD', 'JACK')
INSERT INTO STAGING VALUES (2, 'CHILD', 'KAYALA')
我使用 PIVOT 将行数据显示为列:
SELECT * FROM
(SELECT ENTITYID, PROPERTYNAME, PROPERTYVALUE FROM STAGING) AS T
PIVOT (MAX(PROPERTYVALUE) FOR PROPERTYNAME IN (NAME, SPOUSE, CHILD)) AS T2
输出是:
ENTITYID NAME SPOUSE CHILD
1 DONNA HENRY JACK
2 NULL NULL KAYALA
但他希望输出类似于:
ENTITYID NAME SPOUSE CHILD CHILD
1 DONNA HENRY JACK KAYALA
底线是可以有多个 CHILD 属性进入临时表。我们需要考虑这一点,并将所有 CHILDREN 移到列中。
这可能吗?
【问题讨论】:
-
你怎么知道卡亚拉属于唐娜和亨利?还是因为 Kayala 的实体 ID 也为 1,所以示例错误?
-
其实有一个支持表,有entityid和parententityid关系。但是,我想为了简化这一点,我可以拥有相同的实体 ID。
标签: sql sql-server sql-server-2008 pivot unpivot