복붙노트

[SQL] 열 절에 하위 쿼리와 MS SQL 서버 피벗 테이블

SQL

열 절에 하위 쿼리와 MS SQL 서버 피벗 테이블

임은 확실이 지금까지 답을 찾을 수 있지만 간단한 기술입니다!

나는 가지고있다

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

등 ... (약 800 POINTNAMES에 대한)

많은 pointnames와 나는 'FOR'피벗의 'IN'절에서 각각의 경로를 게시 싶지 않다 정의 (구문으로 아래)하지만, 아마도 하위 쿼리를 사용하고 싶습니다.

나는 하나 개의 TIMESTAMP 값과 각 POINTNAME 많은 열을 얻을 것이다, 그래서 제가하고 싶은 것은, 타임 스탬프 및 VALUE 컬럼과 컬럼 등 모든 POINTNAME 값이다 그래서 나는 집계에 필요가 없습니다, POINTNAME PER TIMESTAMP 당 하나 개의 값이 아무것도 그래서 그냥 최대 어쨌든을 선택?

뭔가 같은 :

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

produce- 것

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

나는 더 아마도이 간단하게 실현할 그러나 희망 당신은 내가 달성하기 위해 노력하고있어거야?

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. ==============================

    1.열을 동적으로 번호를 당신은 동적 SQL을 사용해야합니다

    열을 동적으로 번호를 당신은 동적 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 뿐인 예

  2. from https://stackoverflow.com/questions/13245364/ms-sql-server-pivot-table-with-subquery-in-column-clause by cc-by-sa and MIT license