Atualizações sobre pivôs em SQL Server 2008
-
05-09-2019 - |
Pergunta
Existe uma maneira para realizar atualizações sobre uma mesa girou em SQL Server 2008 onde as mudanças se propagam de volta para a tabela de origem, assumindo que não há agregação?
Solução 2
Isto realmente só funciona se as colunas articuladas formar um identificador exclusivo. Portanto, vamos dar o exemplo de Buggy; aqui é a tabela original:
TaskID Date Hours
e queremos gire-a em uma tabela que se parece com isso:
TaskID 11/15/1980 11/16/1980 11/17/1980 ... etc.
A fim de criar o pivô, você faria algo assim:
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)
Então você tem sua mesa articulada em ##Pivoted
. Agora que executa uma actualização para uma das horas campos:
UPDATE
##Pivoted
SET
[11/16/1980 00:00:00] = 10
WHERE
TaskID = 1234
Agora ##Pivoted
tem uma versão actualizada das horas para uma tarefa que ocorreu em 1980/11/16 e queremos guardar isso de volta para a tabela original, por isso usamos um 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
Você notará que eu modifiquei o exemplo de Buggy à agregação de dia-de-semana. Isso é porque não há nenhuma parte traseira indo e atualização se você executar qualquer tipo de agregação. Se eu atualizar o campo SUNHours, como eu sei que horas de domingo Estou atualizando? Isto só irá funcionar se não houver nenhuma agregação. Espero que isso ajude!
Outras dicas
PIVOT
s exigem sempre uma função de agregação na cláusula de pivô.
Assim, há sempre agregação.
Então, não, não pode ser atualizável.
você pode colocar um INSTEAD OF TRIGGER
em uma visão com base na declaração e, assim, você pode fazer qualquer atualizável vista.
Este é apenas um palpite, mas você pode fazer a consulta em uma exibição e, em seguida, atualizá-lo?
Eu não acredito que é possível, mas se você postar detalhes sobre o problema real que você está tentando resolver alguém pode ser capaz de dar-lhe alguns conselhos sobre uma abordagem diferente para manuseá-lo.