假设没有聚合,有没有办法对 SQL Server 2008 中的 PIVOTed 表执行更新,其中更改传播回源表?
问问题
5547 次
4 回答
1
PIVOT
s 在 pivot 子句中总是需要一个聚合函数。
因此总是有聚合。
所以,不,它不能更新。
您INSTEAD OF TRIGGER
可以根据该语句放置一个视图,因此您可以使任何视图可更新。
这里的例子
于 2009-04-16T17:20:16.350 回答
1
只有当透视列形成唯一标识符时,这才会真正起作用。那么让我们以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
。现在您对小时字段之一执行更新:
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
您会注意到我修改了 Buggy 的示例以删除按星期几的聚合。那是因为如果您执行任何类型的聚合,就没有回头路和更新。如果我更新 SUNHours 字段,我如何知道我正在更新哪个星期日的时间?这仅在没有聚合的情况下才有效。我希望这有帮助!
于 2009-05-08T17:12:19.033 回答
0
这只是一个猜测,但你能把查询变成一个视图然后更新它吗?
于 2009-04-07T17:41:19.883 回答
0
我不相信这是可能的,但是如果您发布有关您尝试解决的实际问题的详细信息,那么某人可能会就不同的处理方法给您一些建议。
于 2009-04-07T17:41:41.333 回答