转轴数记录

man*_*n69 3 sql-server pivot

我有一个包含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这样的.

如何转动这个?

Tar*_*ryn 5

我的建议是看看使用UNPIVOT和PIVOT函数来得到结果.

UNPIVOT将用于将多列DCIIND多列转换为单列中的多行.完成后,您可以将数据转回到列中.

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包含DCIDIND名字,并有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)