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.しかし、私は毎回日付を変更する必要があると思いますか?(それは私が見た構文です)ピボットテーブル自体はそれ自体は単純に見えますが、日時は私に悲しみを引き起こしています。コードスニペットまたはリンクをいただければ幸いです。

ありがとう。

4

1 に答える 1

0

ピボット自体は単純なようです。

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

ストアドプロシージャについては、不完全なグループを除いて、table2に保存された最終日をtable1のフィルターとして使用します(ある時点で、3つのタグすべてが存在し、最終日のみが不完全になる可能性があると想定しています。そうでない場合は、行を更新/挿入するために、最終日の特別な処理が必要になります)。

したがって、コードでは:

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

グループが不完全である可能性がある場合は、除外フィルターを削除し、削除ステートメントを追加して、不完全な場合に最後の日付を削除し@startDate、3ミリ秒前に調整して同じ行を再度取得しますが、現在はさらにいっぱいの状態になっています。

于 2012-07-09T23:57:10.290 に答える