ケーピボットSQL Server2008
-
05-09-2019 - |
質問
があるので、更新を実行に軸テーブルには、SQL Server2008年の変化の伝播のソーステーブルとはありませんの凝集?
解決 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日に行われた作業時間の更新バージョンを持っており、我々はその元のテーブルに保存しておきたいので、私たちは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フィールドを更新した場合、どのように私は私が更新していた日曜日の時間を知っていますか?何の凝集が存在しない場合にのみ動作します。私はこのことができます願っています!
他のヒント
PIVOT
s"常に必要とする集計関数は、ピボットを提供しています。
このように常にある集計対象とします。
なので、できるまで更新可能.
できるサイズで INSTEAD OF TRIGGER
できる事を示書に基づいて、このようにできるビューの更新可能.
例 こちらの
これはただの推測ですが、ビューにクエリを作成し、それを更新することができますか?
私はそれが可能であることを信じていませんが、あなたが解決しようとしている実際の問題についての詳細を投稿した場合、誰かがそれを処理する別のアプローチにあなたにいくつかのアドバイスを与えることができるかもしれません。