数据透视表的问题

时间:2012-07-09 20:02:37

标签: sql sql-server-2005 pivot pivot-table

我知道互联网上有很多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或链接将不胜感激。

感谢。

1 个答案:

答案 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毫秒以再次获取相同的行,但现在更多充满了状态。