Updates auf Pivots in SQL Server 2008
-
05-09-2019 - |
Frage
Gibt es eine Möglichkeit Updates auf einer geschwenkten Tabelle in SQL Server 2008 auszuführen, wo die Änderungen zurück in die Quelltabelle propagieren, vorausgesetzt, es gibt keine Aggregation?
Lösung 2
Dies wird nur dann wirklich funktionieren, wenn die geschwenkten Spalten eine eindeutige Kennung bilden. Also lassen Sie uns Buggy Beispiel nehmen; hier ist die Original-Tabelle:
TaskID Date Hours
und wir wollen es in eine Tabelle schwenken, die wie folgt aussieht:
TaskID 11/15/1980 11/16/1980 11/17/1980 ... etc.
Um die Pivot zu erstellen, würden Sie so etwas tun:
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)
Also dann haben Sie Ihren geschwenkt Tisch in ##Pivoted
. Jetzt führen Sie ein Update auf eine der Stunden Felder:
UPDATE
##Pivoted
SET
[11/16/1980 00:00:00] = 10
WHERE
TaskID = 1234
Jetzt ##Pivoted
hat eine aktualisierte Version der Stunden für eine Aufgabe, die sich am 1980.11.16 und wir wollen, dass wieder auf die ursprüngliche Tabelle speichern, so dass wir verwenden, um eine 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
Sie werden bemerken, dass ich Buggys Beispiel modifizierte Aggregation von Tag-of-Woche zu entfernen. Das liegt daran, es gibt keinen Weg zurück und aktualisiert, wenn Sie irgendeine Art von Aggregation durchzuführen. Wenn ich die Sonnenstunden Feld aktualisieren, wie kann ich wissen, welche am Sonntag Stunden ich zu aktualisieren? Dies funktioniert nur, wenn es keine Aggregation. Ich hoffe, das hilft!
Andere Tipps
PIVOT
s immer eine Aggregatfunktion in der Pivot-Klausel erforderlich.
So gibt es immer Aggregation.
Also, nein, es kann nicht aktualisierbar sein.
Sie können einen INSTEAD OF TRIGGER
auf einem auf der Aussage basiert Ansicht setzen und so können Sie jede Ansicht aktualisierbar machen.
Beispiel hier
das ist nur eine Vermutung, aber können Sie die Abfrage in eine Ansicht machen und dann aktualisieren?
Ich glaube nicht, dass es möglich ist, aber wenn Sie Einzelheiten über das eigentliche Problem schreiben, dass Sie jemand zu lösen sind versuchen, vielleicht in der Lage Ihnen einige Ratschläge auf einem anderen Ansatz zu geben, um es zu behandeln.