我有一个包含4列和超过1亿条记录的表.表设计:
ID char(12) PK
Type Char(2) PK (Values 1,2,3)
DCID varchar(10) Null
IND Varchar(2) Null (Values Y, N)
Run Code Online (Sandbox Code Playgroud)
这需要像这样转动
ID, DCID1, DCID2, DCID3, IND1, IND2, IND3
Run Code Online (Sandbox Code Playgroud)
如果Type的值为1,则在Pivoted表中DCID1应该具有值,或者如果Type为2则DCID2应该具有值,依此类推.此外correspoding IND还需要放置在IND1,IND2,IND3这样的.
如何转动这个?
我的建议是看看使用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;
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo.这给出了一个结果:
| ID | NEW_COL | VALUE |
----------------------------------
| 1 | dcid1 | test |
| 1 | ind1 | Y |
| 2 | dcid2 | est |
| 2 | ind2 | Y |
Run Code Online (Sandbox Code Playgroud)
在new_col包含DCID和IND名字,并有type连结到最终值.这个新值将是您应用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;
Run Code Online (Sandbox Code Playgroud)
请参阅SQL Fiddle with Demo.结果将是:
| 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 |
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
146 次 |
| 最近记录: |