3

我有一个有 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)

这需要像

ID, DCID1, DCID2, DCID3, IND1, IND2, IND3

如果 Type 的值为 1,那么在 Pivoted 表中DCID1应该有这个值,或者如果 Type 是 2DCID2应该有这个值,依此类推。同样对应IND的也需要放在IND1,,,IND2这样IND3

如何解决这个问题?

4

1 回答 1

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;

请参阅SQL Fiddle with Demo。这给出了一个结果:

|           ID | NEW_COL | VALUE |
----------------------------------
| 1            |  dcid1  |  test |
| 1            |   ind1  |     Y |
| 2            |  dcid2  |   est |
| 2            |   ind2  |     Y |

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;

请参阅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 |
于 2013-05-08T16:41:50.167 回答