轴心点数百万条记录

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,则在透视表中,DCID1应该具有该值;如果Type是2,则DCID2应该具有该值,依此类推。同时,相应的IND也需要放置在IND1IND2IND3等位置。
如何进行透视?
1个回答

5
我的建议是同时使用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 |

我已经完成了反转操作,我的表中有ID、Type、DCID和IND等字段,并且它有超过1亿条记录。当我再次进行透视操作时,在获取了1000万条记录(透视后)后,我遇到了内存不足的异常错误。请问有什么最佳的方法可以透视这么多的记录? - man69
@AnandMuthiah 没错,这进一步将“DCID”和“IND”旋转到同一列中。 - Taryn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接