문제

SQL Server 2008의 피벗 테이블에서 업데이트를 수행 할 수있는 방법이 있습니까? 여기서 집계가 없다고 가정 할 때 변경 사항이 소스 테이블로 전파됩니다.

도움이 되었습니까?

해결책 2

이것은 피벗 된 열이 고유 식별자를 형성하는 경우에만 실제로 작동합니다. 그러니 버기의 예를 들어합시다. 다음은 원래 테이블입니다.

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. 이제 시간 필드 중 하나에 대한 업데이트를 수행합니다.

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

지금 ##Pivoted 1980 년 11 월 16 일에 발생한 작업에 대한 업데이트 된 Hours의 버전이 있으며 원래 테이블로 다시 저장하려고합니다. 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

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

다른 팁

PIVOTs는 항상 피벗 조항에서 집계 기능이 필요합니다.

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

따라서, 그것은 업데이트 할 수 없습니다.

당신은 넣을 수 있습니다 INSTEAD OF TRIGGER 진술을 기반으로 한 견해에서, 당신은 모든보기를 업데이트 할 수 있습니다.

예시 여기

이것은 단지 추측 일 뿐이지 만 쿼리를보기로 만들고 업데이트 할 수 있습니까?

나는 그것이 가능하다고 믿지 않지만, 당신이 누군가를 해결하려는 실제 문제에 대한 세부 사항을 게시하면 다른 사람이 그것을 처리하기위한 다른 접근법에 대한 조언을 줄 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top