2012-11-06 42 views
7

Chắc chắn đây là một kỹ thuật đơn giản mặc dù tôi không thể tìm thấy câu trả lời cho đến nay!Bảng tổng hợp MS SQL Server với truy vấn con trong mệnh đề cột

Tôi có

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 

vv ... (đối với khoảng 800 POINTNAMES)

với nhiều pointnames Tôi không muốn liệt kê mỗi một trong 'trong' khoản của trục 'CHO' (như cú pháp đưa ra dưới đây) định nghĩa nhưng muốn sử dụng có lẽ một truy vấn phụ.

Vì vậy, điều tôi muốn là tất cả giá trị POINTNAME dưới dạng cột có cột TIMESTAMP và VALUE, vì vậy tôi sẽ nhận được một giá trị TIMESTAMP và nhiều cột với mỗi POINTNAME, chỉ có một giá trị cho mỗi POINTNAME PER TIMESTAMP. t cần phải tổng hợp bất cứ điều gì vì vậy chỉ cần chọn tối đa nào?

Cái gì như:

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

sẽ produce-

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

Tôi nhận ra nó có lẽ không đơn giản này nhưng hy vọng bạn sẽ có được những gì tôi đang cố gắng để đạt được?

PIVOT CÚ PHÁP:

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

Bạn thay đổi quan trọng dường như bị phá vỡ. Các từ ngẫu nhiên được viết hoa vì một số lý do. –

Trả lời

11

cho số năng động của cột bạn phải sử dụng SQL động

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

Người bạn đời tuyệt vời cảm ơn rất nhiều! ;-) – user1801843

+0

Và sau đó tạo bảng mới dựa trên kết quả? Xin lỗi vẫn là một newbie! – user1801843

+0

Bạn có muốn tạo bảng tạm thời dựa trên kết quả không? Hay bạn muốn tạo một bảng thật? –

Các vấn đề liên quan