1

假设没有聚合,有没有办法对 SQL Server 2008 中的 PIVOTed 表执行更新,其中更改传播回源表?

4

4 回答 4

1

PIVOTs 在 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 回答