我知道互联网上有很多Pivot表示例,但我是SQL的新手,而且我遇到了一些麻烦,因为所有示例似乎都与聚合函数有关。 / p>
Table 1:
|Date | Tag |Value |
|06/10 2:00pm | A | 65 |
|06/10 2:00pm | B | 44 |
|06/10 2:00pm | C | 33 |
|06/10 2:02pm | A | 12 |
|06/10 2:02pm | B | 55 |
|06/10 2:02pm | C | 21 |
....
|06/10 1:58am | A | 23 |
我希望它看起来像是(表2):
|Date | A | B | C |
|06/10 2:00pm| 65 | 44 | 33 |
|06/10 2:02pm| 12 | 55 | 21 |
.....
|06/10 1:58am| 23 | etc. | etc. |
(抱歉格式)
遇到的一些问题(不能使用我在网上找到的代码) 我希望每隔2分钟将其作为存储过程(而不是SQL作业)运行,以便表1中的数据不断移动到表2.但是我想我需要更改每个单独的日期时间? (这就是我见过的语法) 数据透视表本身看起来很简单,但是日期时间让我感到悲伤。 任何代码snipets或链接将不胜感激。
感谢。
答案 0 :(得分:0)
枢轴本身看起来很简单:
select *
from table1
pivot (min (Value) for Tag in ([A], [B], [C])) p
至于存储过程,我会使用table2中保存的最后一个日期作为table1的过滤器,不包括不完整的组(我假设在某些时候,所有三个标签都存在,并且只有最后日期可以如果没有,您将需要特殊处理最后日期来更新/插入一行。)
所以,在代码中:
create proc InsertPivotedTags
as
set NoCount ON
set XACT_ABORT ON
begin transaction
declare @startDate datetime
-- Last date from Table2 or start of time
select @startDate = isnull (max ([Date]), '1753-01-01')
from Table2
insert into Table2
select *
from Table1
pivot (min (Value) for Tag in ([A], [B], [C])) p
where [Date] > @startDate
-- exclude incomplete groups
and a is not null
and b is not null
and c is not null
commit transaction
如果组可能不完整,则应删除exlude过滤器并添加删除语句以删除最后日期以防止它不完整,并将@startDate
调整为3毫秒以再次获取相同的行,但现在更多充满了状态。