2012-11-06 9 views
7

これは簡単な手法ですが、これまでのところ答えは見つかりませんでした。MS SQL Serverピボットテーブルのサブクエリがカラム節にある

私が持っている

TIMESTAMP   | POINTNAME | VALUE 
2012-10-10 16:00:00 AHU01  20 
2012-10-10 16:00:00 AHU02  25 
2012-10-10 16:00:15 AHU01  26 
2012-10-10 16:00:15 AHU02  35 

等...私は 'FOR' ピボットの 'IN' と句に各1を一覧表示したくない多くのpointnamesと

(約800 POINTNAMES用) (以下の構文で)定義されていますが、サブクエリを使用したいと考えています。

POINTNAMEの値はすべてTIMESTAMPとVALUE列の列として表示されますので、1つのTIMESTAMP値と各POINTNAMEの多数の列を取得します。POINTNAME PER TIMESTAMPごとに1つの値しかありません。何も集約する必要はありません。以下のような

何か:

SELECT [TIMESTAMP] FROM (SELECT * FROM POINT_TABLE) 
PIVOT(Max[Value] FOR [POINTNAME] IN (SELECT DISTINCT [POINTNAME] FROM POINT_TABLE) 

が、私はそれはおそらくありません。このシンプルで実現うまくいけば、あなたは私が達成しようとしているものを手に入れる

TIMESTAMP    AHU01   AHU02 
2012-10-10 16:00:00  20    25 
2012-10-10 16:15:00  26    35 

をproduce-でしょうか?

PIVOT構文:

SELECT <non-pivoted column>, 
    [first pivoted column] AS <column name>, 
    [second pivoted column] AS <column name>, 
    ... 
    [last pivoted column] AS <column name> 
FROM 
    (<SELECT query that produces the data>) 
    AS <alias for the source query> 
PIVOT 
(
    <aggregation function>(<column being aggregated>) 
FOR 
[<column that contains the values that will become column headers>] 
    IN ([first pivoted column], [second pivoted column], 
    ... [last pivoted column]) 
) AS <alias for the pivot table> 
<optional ORDER BY clause>; 
+1

、動的SQLを使用する必要がありますが壊れているように見えます。ランダムな言葉は何らかの理由で大文字になります。 –

答えて

11

列の動的な数のためにあなたはあなたがキーをシフト

declare 
    @cols nvarchar(max), 
    @stmt nvarchar(max) 

select @cols = isnull(@cols + ', ', '') + '[' + T.POINTNAME + ']' from (select distinct POINTNAME from TABLE1) as T 

select @stmt = ' 
    select * 
    from TABLE1 as T 
     pivot 
     (
      max(T.VALUE) 
      for T.POINTNAME in (' + @cols + ') 
     ) as P' 

exec sp_executesql @stmt = @stmt 

SQL FIDDLE EXAMPLE

+0

驚くばかりの仲間はとても感謝しています! ;-) – user1801843

+0

そして結果に基づいて新しいテーブルを作成しますか?申し訳ありませんまだ初心者! – user1801843

+0

結果に基づいてテンポラリテーブルを作成しますか?または、実際のテーブルを作成したいですか? –