2014-03-24 27 views
0

我有一張表格(結構是固定的),其中包含24個字段H0-H23,表示一天的小時數。在其中一列中會有一個'M'。一旦找到'M'(在H13中說),那麼我想將H13中的值換成H14中的值(它旁邊的字段),並將H14中的值換成H13。因此,在該示例(我已經它不限於爲了清楚6個字段)將值移入下一列

NULL,NULL,T,T,M,S,F

將改變到

NULL,NULL,T,T ,S,M,F

什麼是最有效的方法呢?謝謝

注:據我瞭解更新查詢,主要的問題是,我需要找到「M」的位置沒有做24條case語句如果可能的話

+0

將您的數據結構更改爲有24行數據而不是24列。像***這樣的分析查詢將會變得更快更簡單。 *(保留現有的結構或者需要編寫一個查詢來暫時將其轉換爲多行,或者編寫一套非常長的CASE語句。)* – MatBailie

+0

感謝您的評論,遺憾的是,這對於此數據集是不可能的現有系統)。我從字面上「卡住」當前的模式。你認爲這是一個更好的主意,轉移數據,找到M,然後不透明嗎?還是應該使用案例陳述方法? – Simon

+0

我喜歡pivot - update - unpivot的想法。我有興趣看到這種情況和案例之間的表現差異。 –

回答

0

正如你不能改變數據結構,你不得不擁有大量的CASE語句...

UPDATE 
    yourTable 
SET 
    H00 = CASE m_hour     WHEN 00 THEN H01 ELSE H00 END, 
    H01 = CASE m_hour WHEN 00 THEN H00 WHEN 01 THEN H02 ELSE H01 END, 
    H02 = CASE m_hour WHEN 01 THEN H01 WHEN 02 THEN H03 ELSE H02 END, 
    H03 = CASE m_hour WHEN 02 THEN H02 WHEN 03 THEN H04 ELSE H03 END, 
    ... 
    H23 = CASE m_hour WHEN 22 THEN H22 WHEN 23 THEN ??? ELSE H23 END 
FROM 
(
    SELECT 
    primary_key, 
    CASE WHEN H00 = 'M' THEN 00 
     WHEN H01 = 'M' THEN 01 
     ... 
    END AS m_hour 
    FROM 
    yourTable 
) 
    AS lookup 
WHERE 
    lookup.primary_key = yourTable.primary_key 


你可以做這樣的事情,而不是縮短子查詢CASE:

CHARINDEX('M', H00 + H01 + H02 + ... + H23, 0) - 1 AS m_hour 

但是,這也會增加一些CPU負載作爲縮短代碼的價格,並沒有擺脫UPDATE中的24個CASE語句。

+0

我創建了以下內容,似乎工作正常並且非常快: – Simon

+0

SELECT HourDay --DD_ID,HourDay,Code FROM (SELECT DD_ID,H0,H1,H2,H3,h4,h5,h6,h7,h8, h0,H11,H12,H13,H14,H15,H16,H17,H18,H19,H20,H21,H22,h23來自[Tbl_DutyDetails],其中DD_ID = DD_ID) UNPIVOT (代碼FOR HourDay IN H1,H2,H3,h4,h5,h6,h7,h8,h9,h10,H11,H12,H13,H14,H15,H16,H17,H18,H19,H20,H21,H22,h23))AS unpvt 其中Code ='M') – Simon