2009-04-07 60 views

回答

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 

你會發現,我修改了越野車的通過例如某一天的一週,除去聚集。這是因爲如果您執行任何類型的聚合,則不會返回並更新。如果我更新SUNHours字段,我如何知道我正在更新哪個星期日的小時?這隻會在沒有聚合的情況下起作用。我希望這有幫助!

0

這只是一個猜測,但是你可以將查詢變成視圖然後更新它嗎?

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 – 2012-08-31 00:33:18

+0

@ElVieejo,感謝您的剪貼評論。但是,我不同意你對我的回答的分析。 – 2012-08-31 12:53:21

+0

不客氣。你問,而不是:) – 2012-08-31 13:02:55

0

我不認爲這是可能的,但是如果您發佈關於您試圖解決的實際問題的具體情況,可能會給您一些關於處理它的不同方法的建議。

1

PIVOT s在pivot子句中總是需要一個聚合函數。

因此總是存在聚合。

所以,不,它不能更新。

你可以把一個INSTEAD OF TRIGGER基於語句中的視圖,從而可以使任何視圖更新。

here