2012-11-06 10 views
7

Jestem pewien, że jest to prosta technika, chociaż nie mogę znaleźć odpowiedzi do tej pory!Tabela przestawna MS SQL Server z podzapytaniem w kolumnie klauzula

mam

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 

etc ... (około 800 POINTNAMES)

z wieloma pointnames nie chcę listy każdy w 'IN' klauzuli czopa 'dla' (jako składnia podana poniżej), ale chciałby użyć prawdopodobnie podkwerendy.

Więc chciałbym, aby wszystkie wartości POINTNAME były kolumnami z kolumną TIMESTAMP i VALUE, więc otrzymam jedną wartość TIMESTAMP i wiele kolumn z każdym POINTNAME, jest tylko jedna wartość na POINTNAME PER TIMESTAMP, więc nie t potrzebujesz agregować wszystko, więc po prostu wybierz max mimo to?

Coś jak:

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

byłoby produce-

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

Zdaję sobie sprawę, że prawdopodobnie nie jest to proste, ale mam nadzieję, że masz za co próbuję osiągnąć?

PIVOT SYNTAX:

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

możliwość zmiany klucza wydaje się być uszkodzony. Losowe słowa są z jakiegoś powodu kapitalizowane. –

Odpowiedz

11

dla liczby dynamicznych kolumn trzeba użyć dynamicznego SQL

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

Wspaniały kumpel dzięki bardzo! ;-) – user1801843

+0

A następnie utworzyć nową tabelę na podstawie wyniku? Przepraszam, wciąż nowicjusz! – user1801843

+0

Czy chcesz utworzyć tabelę tymczasową na podstawie wyniku? A może chcesz stworzyć prawdziwy stół? –