我的建议是同时使用UNPIVOT和PIVOT函数来获得结果。
UNPIVOT将被用于将DCI和IND多个列转换为单个列中的多个行。完成这一步骤后,您可以将数据逆转回列。
UNPIVOT代码类似于以下内容:
select id,
col +type as new_col,
value
from
(
select id,
type,
dcid,
cast(ind as varchar(10)) ind
from yt
) d
unpivot
(
value
for col in (DCID, IND)
) unpiv;
查看 带演示的SQL Fiddle。这将给出一个结果:
| ID | NEW_COL | VALUE |
| 1 | dcid1 | test |
| 1 | ind1 | Y |
| 2 | dcid2 | est |
| 2 | ind2 | Y |
新列包含DCID和IND名称,它将类型值连接到末尾。这个新值将是您应用PIVOT的值:
select id, DCID1, DCID2, DCID3, IND1, IND2, IND3
from
(
select id,
col +type as new_col,
value
from
(
select id,
type,
dcid,
cast(ind as varchar(10)) ind
from yt
) d
unpivot
(
value
for col in (DCID, IND)
) unpiv
) src
pivot
(
max(value)
for new_col in (DCID1, DCID2, DCID3, IND1, IND2, IND3)
) piv;
请查看带演示的SQL Fiddle。结果将会是:
| ID | DCID1 | DCID2 | DCID3 | IND1 | IND2 | IND3 |
-------------------------------------------------------------
| 1 | test | | | Y | | |
| 2 | | est | | | Y | |
| 3 | | | blah | | | Y |
| 4 | yes | | | N | | |
| 5 | | hs | | | N | |
| 6 | | | jr | | | N |