2012-11-06 20 views
7

Bu kadar basit bir teknik olduğundan emin olun, ancak şu ana kadar bir yanıt bulamıyorum!MS SQL Server pivot tabloyu alt sorguya sahip sütun başlığı

Ben

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 

vs ... Ben 'İÇİN' pivot 'IN' maddesi her birini listelemek istemiyorum birçok pointnames ile

(yaklaşık 800 POINTNAMES için) (aşağıda verilen sözdizimi olarak) tanım ama belki bir alt soruyu kullanmak istiyorum.

İstediğim şey tüm POINTNAME değerlerini A TIMESTAMP VE VALUE sütununa sahip sütunlar olarak kullanacağım, böylece bir TIMESTAMP değeri ve her bir POINTNAME ile çok sayıda sütun alacağım, POINTNAME PER TIMESTAMP başına yalnızca bir değer var, bu yüzden yok ' Herhangi bir şey toplamanız gerekiyor, bu yüzden sadece maks. gibi

şey:

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

Muhtemelen hayır bu basit farkında ama umarım ben başarmak için çalışıyorum olsun

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

üretmek-ki?

MİL SÖZDİZİMİ:

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

Sen anahtarı kaydırmak kırık gibi görünüyor dinamik SQL kullanmak zorunda. Rastgele kelimeler bir nedenden dolayı büyük harfle yazılmıştır. –

cevap

11

sütun dinamik sayısı için size

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

Harika arkadaşım çok teşekkürler! ;-) – user1801843

+0

Ve sonuç temelinde yeni tablo oluşturulsun mu? Üzgünüm hala bir acemi! – user1801843

+0

Sonuç temelinde geçici tablo oluşturmak ister misiniz? Yoksa gerçek bir masa yaratmak ister misin? –