0

我不是真正的程序员,所以我对编程的一般知识和特别是 SQL 的知识比这里的任何人都少。我不确定这个问题是否容易,但我真的不知道如何开始。所以,我有这张名为 Photonics 的表:

在此处输入图像描述

我想更改它,以便结果将显示在一个新表中,如下所示:

Name        Timestamp   Value
Photonics   1/1/12 0:15 239.04
Photonics   1/1/12 0:30 247.68
Photonics   1/1/12 0:45 253.44
Photonics   1/1/12 1:00 254.88
Photonics   1/1/12 1:15 253.44
Photonics   1/1/12 1:30 239.04
Photonics   1/1/12 1:45 239.04
Photonics   1/1/12 2:00 239.04
Photonics   1/1/12 2:15 239.04
Photonics   1/1/12 2:30 250.56

有人告诉我这叫做 Pivot!我发现这个话题对于像我这样的初学者来说太复杂了。

4

1 回答 1

4

将数据列转换为行的过程称为 UNPIVOT。有几种方法可以取消透视数据:

您可以使用 UNION ALL 查询:

select 'Photonics' name, dt + cast('12:15 AM' as datetime) timestamp, [12:15 AM] as value
from Photonics
union all
select 'Photonics' name, dt + cast('12:30 AM' as datetime) timestamp, [12:30 AM] as value
from Photonics
union all
select 'Photonics' name, dt + cast('12:45 AM' as datetime) timestamp, [12:45 AM] as value
from Photonics;

请参阅SQL Fiddle with Demo

您可以在 SQL Server 2005+ 中使用 UNPIVOT 函数:

select 'Photonics' name,
  timestamp = dt + cast(timestamp as datetime),
  value
from photonics p
unpivot
(
  value
  for timestamp in ([12:15 AM], [12:30 AM], [12:45 AM], [1:00 AM], [1:15 AM])
) unpiv;

请参阅SQL Fiddle with Demo

您可以在 SQL Server 2008+ 中将 CROSS APPLY 与 Values 一起使用:

select 'Photonics' name,
  timestamp = dt + cast(timestamp as datetime),
  value
from photonics p
cross apply
(
  values
  ('12:15 AM', [12:15 AM]),
  ('12:30 AM', [12:30 AM]),
  ('12:45 AM', [12:45 AM]), 
  ('1:00 AM', [1:00 AM]),
  ('1:15 AM', [1:15 AM])
) c (timestamp, value);

请参阅带有演示的 SQL Fiddle

于 2013-07-09T23:01:28.090 回答