2017-04-26 31 views
0

我有一個看起來像這樣(ID是PK標識字段)添加一個數字上的條件


    ID Date     Condition  Call_Count  
    1 2015-03-02 14:05:05 Terminated  0  
    2 2015-03-02 14:05:10 Transferred 0  
    3 2015-03-02 14:06:02 Transferred 0  
    4 2015-03-02 14:07:00 Transferred 0  
    5 2015-03-02 14:07:50 Terminated  0  
    6 2015-03-02 14:07:60 Transferred 0  
    7 2015-03-02 14:08:55 Terminated  0  
    8 2015-03-02 14:08:56 Terminated  0   

我曾嘗試下面的SQL Server表增加一個SQL Server表:

DECLARE @LoopId INT = 1, 
    @Call_Count INT = 1, 
    @callend INT, 
    @maxId INT, 
    @LoopCounter INT 

Select @MaxId = max(ID) from Table1  

WHILE(@LoopId <= @MaxId) 
BEGIN 
    SELECT @callend = charindex('Terminated', Reason) 
    from Table1 where ID = @LoopId 

    set @Call_Count = @Call_Count + case when @callend > 0 then 1 else 0 end 

    IF @LoopId > 1 
    begin 
    update Table1 
     set Call_Counter = @Call_Count 
     WHERE Id = @LoopID 
    end 

    SET @LoopId = @LoopId + 1   
END 

我得到的結果是這樣的:


    ID Date     Condition  Call_Count  
    1 2015-03-02 14:05:05 Terminated  1 
    2 2015-03-02 14:05:05 Terminated  2 
    3 2015-03-02 14:05:05 Terminated  3 
    4 2015-03-02 14:05:05 Terminated  4 
    5 2015-03-02 14:05:10 Transferred 4  
    6 2015-03-02 14:06:02 Transferred 4  
    7 2015-03-02 14:07:00 Transferred 4  
    8 2015-03-02 14:07:50 Terminated  5  
    9 2015-03-02 14:07:60 Transferred 5  
    10 2015-03-02 14:08:55 Terminated  6  
    11 2015-03-02 14:08:56 Terminated  6 

我需要一個ID字段生成的都會有這樣的結果,它的東東ds將最後一個「終止」之後的數字更改爲將一個「呼叫」置於一個組中。


    ID Date     Condition  Call_Count  
    1 2015-03-02 14:05:05 Terminated  1 
    2 2015-03-02 14:05:05 Terminated  2 
    3 2015-03-02 14:05:05 Terminated  3 
    4 2015-03-02 14:05:05 Terminated  4 
    5 2015-03-02 14:05:10 Transferred 5  
    6 2015-03-02 14:06:02 Transferred 5  
    7 2015-03-02 14:07:00 Transferred 5  
    8 2015-03-02 14:07:50 Terminated  5  
    9 2015-03-02 14:07:60 Transferred 6  
    10 2015-03-02 14:08:55 Terminated  6  
    11 2015-03-02 14:08:56 Terminated  7 
+0

正在使用的是何種版本的SQL Server? –

+0

我忘了添加,這是SQL Server 2012,謝謝! –

回答

3

最簡單的辦法,應該在SQL Server的任何版本的使用與 更新的內連接到相關的派生表 一個相關子查詢。

(保存我們這一步在你未來的問題 - 如果你想這樣做,是你自己,我會張貼在第一attampt正確和測試的解決方案)創建和填充示例表

CREATE TABLE Table1 
(
    ID int identity(1,1), 
    [Date] datetime, 
    Condition nvarchar(20), 
    Call_Counter int 
) 
INSERT INTO Table1 ([Date], Condition) VALUES 
('2015-03-02 14:05:05', 'Terminated'), 
('2015-03-02 14:05:10', 'Transferred'), 
('2015-03-02 14:06:02', 'Transferred'), 
('2015-03-02 14:07:00', 'Transferred'), 
('2015-03-02 14:07:50', 'Terminated'), 
('2015-03-02 14:07:59', 'Transferred'), 
('2015-03-02 14:08:55', 'Terminated'), 
('2015-03-02 14:08:56', 'Terminated') 

update語句:

UPDATE t1 
SET Call_Counter = 
    (
     SELECT COUNT(*) As CallCounter 
     FROM Table1 t2 
     WHERE Condition = 'Terminated' 
     AND t2.ID <= t1.ID 
    ) 
FROM Table1 t1 

See live demo on rextester.

第一ATT搶先(錯誤)

UPDATE t1 
SET Call_Counter = CallCounter 
FROM Table1 t1 
INNER JOIN 
(
    SELECT COUNT(*) As CallCounter 
    FROM Table1 t2 
    WHERE Condition = 'Terminated' 
    AND ID <= t1.ID 
) t3 

+0

謝謝Zohar,我會試試看。我遇到了一些語法錯誤,但我得到了你解釋的東西的漂移。 –

+0

HI Zohar,nope,只是將所有call_count字段重置爲0 ... –

+0

我編輯了我的答案。這應該工作。 –

1

類似的解決方案,因此瑣。但我寧願先計算所有的值。還要利用窗口功能。

SQL DEMO

WITH CTE as (
    SELECT ID , 
      COUNT(CASE WHEN [Condition] = 'Terminated' THEN 1 END) 
      OVER (ORDER BY [ID]) as rn 
    FROM Table1 
)  
UPDATE A 
SET [Call_Count] = CASE WHEN [Condition] = 'Terminated' 
         THEN B.rn 
         ELSE B.rn + 1 
        END 
FROM Table1 A 
JOIN CTE B 
    ON A.ID = B.ID; 
+0

嗨胡安,感謝您的幫助。我仍然遇到「終止」計數發生變化的原始問題,它應該在下一行更改。所以要衡量一次調用完成的時間,它不應該以Terminated開始,而應該在那之後的行以及批次中的最後一行應該是Terminated ...不知道我是否正確解釋它。 –

+0

你可以用一些數據修改rextester演示,這樣我就可以看到問題了嗎?更新數據...給我發送鏈接..告訴我你期望的結果,我將與我的查詢結果進行比較來修復它。 –