2012-07-09 156 views
1

我知道互联网上有很多数据透视表的例子,但是我对SQL很陌生,而且我遇到了一些麻烦,因为所有例子似乎都与聚合函数有关。数据透视表故障

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. | 

(抱歉格式)

是遇到一些问题(不工作与我在网上找到的代码) 我想运行这个存储过程(而不是一个SQL作业),每2分钟,以便表1中的这些数据不断被移动到表2.但我想我会需要等等每一次的日期? (多数民众赞成我看过的语法) 数据透视表本身似乎很简单,但日期时间一直让我悲伤。 任何代码snipets或链接将不胜感激。

谢谢。

+0

是以该格式存储的日期吗? '06/10 2:02 pm'日期栏上的数据类型是什么? – Taryn 2012-07-09 20:08:37

+0

如果您有多个具有相同日期和类型的行,输出会是什么?例如,如果您添加'06/10 2:00 pm | A | 50'。 – 2012-07-09 20:47:03

+0

@bluefeet格式将是一个日期时间戳类似于:06-20-2012 00:02:13上午(我目前没有格式在我面前,但那是非常接近) – akwarywo 2012-07-09 22:58:56

回答

0

枢本身似乎很简单:

select * 
from table1 
pivot (min (Value) for Tag in ([A], [B], [C])) p 

至于存储过程,我会用保存在表2为表1的过滤器最后日期,但不包括不完整的组(我假定会有,在有些点,所有三个标签都存在,并且只有最后一个日期可能不完整,否则,需要对上一个日期进行特殊处理以更新/插入一行)。

所以,在代码:

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过滤器,并添加一个delete语句,在情况下,它是不完全的消除最后日期,并调整@startDate三毫秒起得早再次相同的行,但现在处于更充满状态。