집계가 없다고 가정하고 변경 내용이 원본 테이블로 다시 전파되는 SQL Server 2008의 PIVOTed 테이블에서 업데이트를 수행하는 방법이 있습니까?SQL Server 2008의 PIVOT에 대한 업데이트
답변
피봇 열이 고유 식별자를 형성하는 경우에만 정말 작동합니다. 그럼 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 필드를 업데이트하면 일요일에 업데이트되는 시간을 어떻게 알 수 있습니까? 집계가없는 경우에만 작동합니다. 이게 도움이 되길 바란다!
이것은 단지 추측이지만보기로 쿼리를 만든 다음 업데이트 할 수 있습니까?
이 질문에 대한 답변을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남겨 둡니다. –
@ElVieejo, 잘라내 기와 붙이기 주셔서 감사합니다. 그러나, 나는 당신이 나의 대답에 대한 분석에 동의하지 않는다. –
당신을 진심으로 환영합니다. 당신은 묻지 말고 : –
나는 그것이 가능하다고 생각하지 않지만 실제 문제에 대한 구체적인 내용을 게시하면 누군가를 해결하려고 시도하는 것이 다른 처리 방법에 대한 조언을 줄 수 있습니다.
굉장 @ 브라이언. 설명에 감사드립니다. –