2009-04-07 10 views

답변

1

피봇 열이 고유 식별자를 형성하는 경우에만 정말 작동합니다. 그럼 Buggy의 예를 들어 봅시다. 여기에 원래 테이블 :

TaskID Date Hours 

는 그리고 우리는 다음과 같다 테이블로 피벗 할 :

피벗을 만들기 위해, 당신은 같은 것을 할 것입니다에서
TaskID 11/15/1980 11/16/1980 11/17/1980 ... etc. 

:

DECLARE @FieldList NVARCHAR(MAX) 

SELECT 
    @FieldList = 
    CASE WHEN @FieldList <> '' THEN 
     @FieldList + ', [' + [Date] + ']' 
    ELSE 
     '[' + [Date] + ']' 
    END 
FROM 
    Tasks 



DECLARE @PivotSQL NVARCHAR(MAX) 
SET @PivotSQL = 
    ' 
     SELECT 
      TaskID 
      , ' + @FieldList + ' 
     INTO 
      ##Pivoted 
     FROM 
      (
       SELECT * FROM Tasks 
      ) AS T 
     PIVOT 
      (
       MAX(Hours) FOR T.[Date] IN (' + @FieldList + ') 
      ) AS PVT 
    ' 

EXEC(@PivotSQL) 

그러면 피벗 테이블이 ##Pivoted에 있습니다. 이제 시간 필드 중 하나에 대한 업데이트를 수행 : 이제 ##Pivoted

UPDATE 
    ##Pivoted 
SET 
    [11/16/1980 00:00:00] = 10 
WHERE 
    TaskID = 1234 

1980년 11월 16일에 일어난 작업에 대한 시간의 업데이트 된 버전을 가지고 있으며, 우리는 다시 원래로 저장하려면 표는, 그래서 우리는 사용 UNPIVOT :

DECLARE @UnPivotSQL NVarChar(MAX) 
SET @UnPivotSQL = 
    ' 
     SELECT 
       TaskID 
      , [Date] 
      , [Hours] 
     INTO 
      ##UnPivoted 
     FROM 
      ##Pivoted 
     UNPIVOT 
     (
      Value FOR [Date] IN (' + @FieldList + ') 
     ) AS UP 

    ' 

EXEC(@UnPivotSQL) 

UPDATE 
    Tasks 
SET 
    [Hours] = UP.[Hours] 
FROM 
    Tasks T 
INNER JOIN 
    ##UnPivoted UP 
ON 
    T.TaskID = UP.TaskID 

당신은 내가 요일에 의해 집계를 제거 버기의 예를 수정 한 것을 알 수 있습니다. 어떤 종류의 집계를 수행하더라도 되돌아 가지 않고 업데이트 할 필요가 없기 때문입니다. SUNHours 필드를 업데이트하면 일요일에 업데이트되는 시간을 어떻게 알 수 있습니까? 집계가없는 경우에만 작동합니다. 이게 도움이 되길 바란다!

+0

굉장 @ 브라이언. 설명에 감사드립니다. –

0

이것은 단지 추측이지만보기로 쿼리를 만든 다음 업데이트 할 수 있습니까?

+0

이 질문에 대한 답변을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남겨 둡니다. –

+0

@ElVieejo, 잘라내 기와 붙이기 주셔서 감사합니다. 그러나, 나는 당신이 나의 대답에 대한 분석에 동의하지 않는다. –

+0

당신을 진심으로 환영합니다. 당신은 묻지 말고 : –

0

나는 그것이 가능하다고 생각하지 않지만 실제 문제에 대한 구체적인 내용을 게시하면 누군가를 해결하려고 시도하는 것이 다른 처리 방법에 대한 조언을 줄 수 있습니다.

1

PIVOT에는 항상 pivot 절의 집계 함수가 필요합니다.

따라서 항상 집계가 있습니다.

아니요, 업데이트 할 수 없습니다.

INSTEAD OF TRIGGER을 명령문을 기반으로보기에 배치 할 수 있으며 따라서 어떤보기도 업데이트 할 수 있습니다.

here

+0

원본 테이블을 업데이트하기 위해 INSTEAD OF 트리거를 어떻게 사용할 수 있습니까? – brian

+0

예 : http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=120679 –