SQL Server 2008의 피벗 업데이트
-
05-09-2019 - |
문제
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 필드를 업데이트하면 업데이트하는 일요일 시간을 어떻게 알 수 있습니까? 집계가없는 경우에만 작동합니다. 이게 도움이 되길 바란다!
다른 팁
PIVOT
s는 항상 피벗 조항에서 집계 기능이 필요합니다.
따라서 항상 집계가 있습니다.
따라서, 그것은 업데이트 할 수 없습니다.
당신은 넣을 수 있습니다 INSTEAD OF TRIGGER
진술을 기반으로 한 견해에서, 당신은 모든보기를 업데이트 할 수 있습니다.
예시 여기
이것은 단지 추측 일 뿐이지 만 쿼리를보기로 만들고 업데이트 할 수 있습니까?
나는 그것이 가능하다고 믿지 않지만, 당신이 누군가를 해결하려는 실제 문제에 대한 세부 사항을 게시하면 다른 사람이 그것을 처리하기위한 다른 접근법에 대한 조언을 줄 수 있습니다.